Java 21迁移时JAXB/JAX-WS生成代码仍使用javax而非Jakarta的问题求助
Java 21迁移时JAXB/JAX-WS生成代码仍使用javax而非Jakarta的问题求助
看起来你遇到了Java 21迁移里一个很典型的问题:Maven Rewrite插件确实能帮你批量替换已有代码和依赖中的javax为Jakarta,但它没法自动调整代码生成工具链的配置——你现在用的org.codehaus.mojo:jaxws-maven-plugin还是旧版的,默认依赖javax版本的JAXB/JAX-WS工具,自然生成的代码还是老的命名空间。结合你的pom文件,我整理了具体的解决步骤:
问题核心原因
- 旧版
jaxws-maven-plugin(org.codehaus.mojo组)是基于javax API开发的,没有适配Jakarta命名空间; - 你的
customBinding.xjb文件大概率还在使用javax的JAXB命名空间,进一步固化了生成代码的包路径; - 部分依赖虽然换成了Jakarta API,但代码生成插件的底层依赖可能还是javax版本的。
分步解决方案
1. 替换JAX-WS Maven插件为Jakarta兼容版本
旧的org.codehaus.mojo:jaxws-maven-plugin已经停止维护,需要换成com.sun.xml.ws组的Jakarta适配版,同时明确指定依赖的Jakarta API:
<plugin> <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-maven-plugin</artifactId> <!-- 选择支持Jakarta的版本,比如2.3.6及以上 --> <version>2.3.6</version> <executions> <execution> <goals> <goal>wsimport</goal> </goals> </execution> </executions> <configuration> <args> <arg>-B-XautoNameResolution</arg> <arg>-extension</arg> </args> <wsdlDirectory>src/main/resources/META-INF/wsdl</wsdlDirectory> <bindingFiles> <bindingFile>${project.basedir}/src/main/resources/xjbs/customBinding.xjb</bindingFile> </bindingFiles> <wsdlLocation>http://localhost/wsdl/Dokumaker-Publishing</wsdlLocation> <xjcArgs> <xjcArg>-Xfluent-api</xjcArg> </xjcArgs> <keep>true</keep> <sourceDestDir>${project.basedir}/src/generated</sourceDestDir> </configuration> <dependencies> <!-- 明确指定Jakarta版本的API依赖 --> <dependency> <groupId>jakarta.xml.ws</groupId> <artifactId>jakarta.xml.ws-api</artifactId> <version>2.3.3</version> </dependency> <dependency> <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-rt</artifactId> <version>2.3.6</version> </dependency> </dependencies> </plugin>
2. 更新customBinding.xjb的命名空间
打开你的customBinding.xjb文件,把所有javax相关的命名空间替换为Jakarta的:
- 将
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"改为xmlns:jaxb="https://jakarta.ee/xml/ns/jaxb" - 将
jaxb:version="2.1"(或其他旧版本)改为jaxb:version="3.0"(对应Jakarta EE 9+规范)
3. 同步更新JAXB依赖为Jakarta版本
确保pom里的JAXB相关依赖都是Jakarta兼容版,替换旧的javax依赖:
<dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-core</artifactId> <!-- 选择适配Jakarta的版本,比如4.0.4 --> <version>4.0.4</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>4.0.4</version> <scope>runtime</scope> </dependency>
4. 清理并重新生成代码
执行以下命令清理旧的生成文件,重新运行代码生成:
mvn clean generate-sources
额外注意事项
- 检查父pom
project-build中是否存在默认的javax依赖,如果有需要在当前pom中覆盖为Jakarta版本; - Java 21完全移除了javax API,所以必须保证所有生成代码、依赖、配置都切换到Jakarta命名空间,否则会出现编译或运行时错误;
- 如果使用
-Xfluent-api扩展,要确保该扩展也支持Jakarta版本(通常新版jaxws-maven-plugin会自带兼容的扩展)。
内容来源于stack exchange




