You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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文件,我整理了具体的解决步骤:

问题核心原因

  1. 旧版jaxws-maven-plugin(org.codehaus.mojo组)是基于javax API开发的,没有适配Jakarta命名空间;
  2. 你的customBinding.xjb文件大概率还在使用javax的JAXB命名空间,进一步固化了生成代码的包路径;
  3. 部分依赖虽然换成了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

额外注意事项

  • 检查父pomproject-build中是否存在默认的javax依赖,如果有需要在当前pom中覆盖为Jakarta版本;
  • Java 21完全移除了javax API,所以必须保证所有生成代码、依赖、配置都切换到Jakarta命名空间,否则会出现编译或运行时错误;
  • 如果使用-Xfluent-api扩展,要确保该扩展也支持Jakarta版本(通常新版jaxws-maven-plugin会自带兼容的扩展)。

内容来源于stack exchange

火山引擎 最新活动