升级至Java17+SpringBoot3后,jaxb2-maven-plugin无法正确生成ObjectFactory
JAXB2 Maven插件3.1.0在Java17+SpringBoot3环境下ObjectFactory仅生成.java文件导致IDE无法解析问题
问题背景
使用jaxb2-maven-plugin 3.1.0从XSD生成Java类,升级到Java17和SpringBoot3环境后,其他类均正常生成.class文件,唯独ObjectFactory仅生成未编译的.java文件。IDE无法解析该类(无论是当前项目直接使用,还是依赖该项目的其他项目导入),但项目实际编译、测试均能正常运行。
插件配置
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <release>${java.version}</release> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.2</version> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>jaxb2-maven-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <id>xjc</id> <goals> <goal>xjc</goal> </goals> </execution> </executions> <configuration> <xjbSources> <xjbSource>${basedir}/src/main/resources/xjb/bindings.xjb</xjbSource> </xjbSources> <sources> <source>${basedir}/src/main/resources/xsd/my-xsd.xsd</source> </sources> <outputDirectory>${project.build.directory}/generated-sources/xjc</outputDirectory> <packageName>com....</packageName> </configuration> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> <version>3.3.0</version> <executions> <execution> <id>add-source</id> <phase>generate-sources</phase> <goals> <goal>add-source</goal> </goals> <configuration> <sources> <source>${project.build.directory}/generated-sources/xjc</source> </sources> </configuration> </execution> </executions> </plugin>
现象细节
- IDE中
ObjectFactory类标红,无法自动导入或识别 - 生成目录
/generated-sources/xjc下仅存在ObjectFactory.java,其他类已编译为.class文件 target/classes目录中存在ObjectFactory.class,与其他类结构一致- 依赖该项目的其他项目也出现相同IDE解析问题,但编译运行不受影响
问题排查与解决方案
1. 修复Jakarta命名空间绑定配置
JAXB3.x已完全迁移到Jakarta命名空间,原javax.xml.bind包替换为jakarta.xml.bind,绑定文件可能存在命名空间不兼容问题。
修改bindings.xjb的命名空间声明:
<jaxb:bindings xmlns:jaxb="https://jakarta.ee/xml/ns/jaxb" xmlns:xsd="http://www.w3.org/2001/XMLSchema" jaxb:version="3.0"> <!-- 原有绑定配置 --> </jaxb:bindings>
2. 调整插件执行顺序与编译触发
显式指定jaxb插件的执行阶段,确保生成代码在编译前完成,同时强制IDE识别生成的源码目录:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>jaxb2-maven-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <id>xjc</id> <phase>generate-sources</phase> <!-- 显式绑定到generate-sources阶段 --> <goals> <goal>xjc</goal> </goals> </execution> </executions> <!-- 其余配置不变 --> </plugin>
执行命令强制重新生成并编译:
mvn clean generate-sources compile
之后刷新IDE缓存(IntelliJ:File -> Invalidate Caches / Restart;Eclipse:Project -> Clean)。
3. 更换为Jakarta官方JAXB插件
org.codehaus.mojo的jaxb2-maven-plugin在Jakarta环境下可能存在兼容性缺陷,建议替换为Eclipse官方的Jakarta JAXB插件:
<plugin> <groupId>org.eclipse.persistence</groupId> <artifactId>org.eclipse.persistence.jaxb.maven.plugin</artifactId> <version>4.0.2</version> <executions> <execution> <id>xjc</id> <goals> <goal>xjc</goal> </goals> </execution> </executions> <configuration> <schemaDirectory>${basedir}/src/main/resources/xsd</schemaDirectory> <schemaFiles>my-xsd.xsd</schemaFiles> <bindingDirectory>${basedir}/src/main/resources/xjb</bindingDirectory> <bindingFiles>bindings.xjb</bindingFiles> <outputDirectory>${project.build.directory}/generated-sources/xjc</outputDirectory> <packageName>com....</packageName> <xmlVersion>3.0</xmlVersion> </configuration> </plugin>
同时引入Jakarta JAXB依赖:
<dependency> <groupId>jakarta.xml.bind</groupId> <artifactId>jakarta.xml.bind-api</artifactId> <version>3.0.2</version> </dependency> <dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>org.eclipse.persistence.moxy</artifactId> <version>4.0.2</version> </dependency>
4. 强制更新IDE依赖索引
若以上操作无效,可尝试:
- 删除本地Maven仓库中该项目的依赖缓存,重新执行
mvn clean install - 在IDE中重新导入Maven项目(IntelliJ:
File -> New -> Project from Existing Sources;Eclipse:File -> Import -> Maven -> Existing Maven Projects)
内容的提问来源于stack exchange,提问作者lcgsrick
相关产品推荐
相关产品推荐

