Java11环境下使用Apache CXF 3.3.X版wsdl2java命令行报错求助
问题:Java 11环境下Apache CXF 3.3.X命令行wsdl2java报错的解决方案
背景
此前使用Java 8搭配Apache CXF 2.7.0执行WSDL转Java代码操作完全正常,升级至Java 11后,尝试使用Apache CXF 3.3.X版本的命令行wsdl2java工具时出现报错,但Maven插件方式可正常运行。
已尝试操作与报错信息
- 执行命令:
wsdl2java -client -autoNameResolution C:\SAMPLE.wsdl
- 报错内容:
Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/ws/Service at org.apache.cxf.tools.wsdlto.frontend.jaxws.JAXWSContainer.isJaxws22(JAXWSContainer.java:64) at org.apache.cxf.tools.wsdlto.frontend.jaxws.JAXWSContainer.getServiceTarget(JAXWSContainer.java:61) at org.apache.cxf.tools.wsdlto.frontend.jaxws.JAXWSContainer.validate(JAXWSContainer.java:68) at org.apache.cxf.tools.wsdlto.WSDLToJavaContainer.processWsdl(WSDLToJavaContainer.java:172) at org.apache.cxf.tools.wsdlto.WSDLToJavaContainer.execute(WSDLToJavaContainer.java:164) at org.apache.cxf.tools.wsdlto.WSDLToJavaContainer.execute(WSDLToJavaContainer.java:412) at org.apache.cxf.tools.common.toolspec.ToolRunner.runTool(ToolRunner.java:105) at org.apache.cxf.tools.wsdlto.WSDLToJava.run(WSDLToJava.java:113) at org.apache.cxf.tools.wsdlto.WSDLToJava.run(WSDLToJava.java:86) at org.apache.cxf.tools.wsdlto.WSDLToJava.main(WSDLToJava.java:185) Caused by: java.lang.ClassNotFoundException: javax.xml.ws.Service at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) ... 10 more
- 手动添加到CXF lib目录的依赖:
第一种组合:
<!-- API, java.xml.bind module --> <dependency> <groupId>jakarta.xml.bind</groupId> <artifactId>jakarta.xml.bind-api</artifactId> <version>2.3.2</version> </dependency> <!-- Runtime, com.sun.xml.bind module --> <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> <version>2.3.2</version> </dependency>
第二种组合:
<dependencies> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1.1</version> </dependency> </dependencies>
- 当前Java版本:
openjdk version "11.0.16" 2022-07-19 OpenJDK Runtime Environment Temurin-11.0.16+8 (build 11.0.16+8) OpenJDK 64-Bit Server VM Temurin-11.0.16+8 (build 11.0.16+8, mixed mode)
- 可正常运行的Maven插件配置:
<build> <plugins> <plugin> <groupId>org.apache.cxf</groupId> <artifactId>cxf-codegen-plugin</artifactId> <version>3.3.0</version> <executions> <execution> <id>generate-sources</id> <phase>generate-sources</phase> <configuration> <wsdlOptions> <wsdlOption> <wsdl>src/main/resources/GIMA2Java.wsdl</wsdl> <faultSerialVersionUID>1</faultSerialVersionUID> <extraargs> <extraarg>-autoNameResolution</extraarg> </extraargs> </wsdlOption> </wsdlOptions> </configuration> <goals> <goal>wsdl2java</goal> </goals> </execution> </executions> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>3.3.0</version> </dependency> </dependencies>
解决方案
报错根源是Java 11移除了JEE模块(包括JAX-WS、JAXB),而CXF 3.3.X命令行工具默认未包含这些依赖,Maven插件会自动拉取所有所需依赖因此可正常运行。具体解决步骤:
补充必要依赖
CXF 3.3.X基于javax命名空间API,需下载以下核心JAR放入CXF的lib目录:javax.xml.ws-api-2.3.1.jarjaxb-api-2.3.1.jarjaxb-impl-2.3.1.jarjaxb-runtime-2.3.1.jarjavax.activation-api-1.2.0.jarcxf-rt-frontend-jaxws-3.3.X.jar及其关联依赖
使用java命令指定完整类路径运行
直接调用wsdl2java的主类,确保类路径包含CXF lib下所有JAR。示例命令(假设CXF安装目录为D:\apache-cxf-3.3.0):java -cp "D:\apache-cxf-3.3.0\lib\*" org.apache.cxf.tools.wsdlto.WSDLToJava -client -autoNameResolution C:\SAMPLE.wsdl修改CXF自带脚本
编辑Windows下的wsdl2java.bat或Linux下的wsdl2java.sh,确保脚本中的类路径包含所有补充的依赖JAR。
注意:不要混用Jakarta和javax命名空间的依赖,避免版本冲突。
内容的提问来源于stack exchange,提问作者Mahajan
相关产品推荐
相关产品推荐

