升级Apache CXF 4.0.3至4.0.4后构建失败:wsdl2java目标执行报错
Apache CXF 4.0.4升级后wsdl2java构建失败解决办法
问题背景
将Apache CXF从4.0.3升级至4.0.4后,项目构建执行cxf-codegen-plugin:wsdl2java目标时失败,错误信息如下:
Failed to execute goal org.apache.cxf:cxf-codegen-plugin:4.0.4:wsdl2java (generate-sources) on project Exit code: 1 Command line was: /opt/tools/java/jdk17.0.4.1_linux-x64/bin/java --add-exports=jdk.xml.dom/org.w3c.dom.html=ALL-UNNAMED --add-exports=java.xml/com.sun.org.apache.xerces.internal.impl.xs=ALL-UNNAMED --add-opens java.base/java.security=ALL-UNNAMED --add-opens java.base/java.net=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.util.concurrent=ALL-UNNAMED -jar /tmp/GSCLAIMS-GCCDATASERVICE183-TESTANDPUBLISH/cxf-tmp-12338135658495952580/cxf-codegen4068116116883184370.jar /tmp/GSCLAIMS-GCCDATASERVICE183-TESTANDPUBLISH/cxf-tmp-12338135658495952580/cxf-w2j11416424235311688218args
构建失败前出现的警告内容为:
[WARNING] 注入org.apache.cxf.maven_plugin.WSDL2JavaMojo时出错
com.google.inject.ProvisionException: 无法完成注入,错误如下:
- 注入构造函数时出错,java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
at org.apache.cxf.maven_plugin.WSDL2JavaMojo.(WSDL2JavaMojo.java:423)
while locating org.apache.cxf.maven_plugin.WSDL2JavaMojo
问题原因
CXF 4.x版本全面迁移至Jakarta EE规范,不再依赖Java EE的JAXB API;而Java 17已移除内置的JAXB模块,同时4.0.4版本的cxf-codegen-plugin默认未包含Jakarta JAXB相关依赖,导致代码生成时找不到必要的绑定类。
解决步骤
1. 给cxf-codegen-plugin添加Jakarta JAXB依赖
在Maven的插件配置中,为cxf-codegen-plugin加入Jakarta XML Binding的API和运行时实现依赖,确保插件能找到必要的类:
<plugin> <groupId>org.apache.cxf</groupId> <artifactId>cxf-codegen-plugin</artifactId> <version>4.0.4</version> <executions> <execution> <id>generate-sources</id> <phase>generate-sources</phase> <goals> <goal>wsdl2java</goal> </goals> <configuration> <!-- 保留你原本的WSDL路径等配置 --> </configuration> </execution> </executions> <dependencies> <!-- Jakarta JAXB API --> <dependency> <groupId>jakarta.xml.bind</groupId> <artifactId>jakarta.xml.bind-api</artifactId> <version>4.0.1</version> </dependency> <!-- JAXB运行时实现 --> <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> <version>4.0.4</version> <scope>runtime</scope> </dependency> </dependencies> </plugin>
2. 替换项目中旧的Java EE JAXB依赖
检查项目的依赖列表,若存在javax.xml.bind:jaxb-api这类Java EE版本的JAXB依赖,全部替换为Jakarta版本:
<!-- 移除旧依赖 --> <!-- <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> </dependency> --> <!-- 添加Jakarta版本依赖 --> <dependency> <groupId>jakarta.xml.bind</groupId> <artifactId>jakarta.xml.bind-api</artifactId> <version>4.0.1</version> </dependency>
3. 清理构建缓存后重试
清理Maven本地仓库的缓存和项目构建临时文件,避免旧依赖干扰:
mvn clean install -U
补充说明
CXF 4.x与3.x的核心差异是包名从javax.*切换为jakarta.*,所有涉及Java EE规范的组件(如JAXB、JAX-WS等)都需要同步升级到Jakarta版本,才能保证兼容性。
内容的提问来源于stack exchange,提问作者KJ21
相关产品推荐
相关产品推荐

