Java 17迁移Jakarta EE:mvn generate-sources生成javax而非jakarta类问题
问题原因与解决方案
你的核心问题是使用的maven-jaxb2-plugin版本(0.15.3)不支持Jakarta EE的命名空间。这个旧版插件默认基于javax.xml.bind生成代码,哪怕你项目里引入了Jakarta的JAXB API依赖,插件本身依然会用旧的javax路径生成注解导入。
解决步骤
1. 升级maven-jaxb2-plugin到支持Jakarta的版本
从插件的3.x版本开始,maven-jaxb2-plugin正式支持Jakarta EE 9+的jakarta命名空间。建议升级到最新的3.x稳定版(比如3.1.0),该版本适配JAXB 4.x与Java 17。
2. 调整插件配置,强制使用Jakarta绑定
修改pom.xml中的插件配置,确保插件依赖Jakarta版本的JAXB工具,并通过参数明确指定生成Jakarta注解:
<build> <plugins> <plugin> <groupId>org.jvnet.jaxb2.maven2</groupId> <artifactId>maven-jaxb2-plugin</artifactId> <!-- 升级到支持Jakarta的版本 --> <version>3.1.0</version> <dependencies> <!-- 明确指定插件使用Jakarta的JAXB API --> <dependency> <groupId>jakarta.xml.bind</groupId> <artifactId>jakarta.xml.bind-api</artifactId> <version>4.0.0</version> </dependency> <!-- 引入Jakarta版本的XJC代码生成器 --> <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-xjc</artifactId> <version>4.0.3</version> </dependency> </dependencies> <configuration> <!-- 强制生成Jakarta命名空间的注解 --> <args> <arg>-Xjc-annotations=jakarta.xml.bind.annotation</arg> </args> <!-- 保留你原有的其他配置 --> </configuration> </plugin> <!-- 其他插件 --> </plugins> </build>
3. 重新生成代码
执行以下命令清理并重新生成源码:
mvn clean generate-sources
验证结果
检查target/generated-sources下的类文件,此时导入语句应该变为:
import jakarta.xml.bind.annotation.XmlAccessType; import jakarta.xml.bind.annotation.XmlAccessorType; import jakarta.xml.bind.annotation.XmlElement; import jakarta.xml.bind.annotation.XmlType;
额外注意事项
- 确保项目中没有其他依赖引入
javax.xml.bind:jaxb-api,避免依赖冲突。可以通过mvn dependency:tree命令排查是否存在旧版javax依赖。 - JAXB 4.x要求Java 11+,与你的Java 17环境完全兼容,无需额外调整。
内容的提问来源于stack exchange,提问作者jennifer ruurs
相关产品推荐
相关产品推荐

