You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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插件会自动拉取所有所需依赖因此可正常运行。具体解决步骤:

  1. 补充必要依赖
    CXF 3.3.X基于javax命名空间API,需下载以下核心JAR放入CXF的lib目录:

    • javax.xml.ws-api-2.3.1.jar
    • jaxb-api-2.3.1.jar
    • jaxb-impl-2.3.1.jar
    • jaxb-runtime-2.3.1.jar
    • javax.activation-api-1.2.0.jar
    • cxf-rt-frontend-jaxws-3.3.X.jar及其关联依赖
  2. 使用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
    
  3. 修改CXF自带脚本
    编辑Windows下的wsdl2java.bat或Linux下的wsdl2java.sh,确保脚本中的类路径包含所有补充的依赖JAR。

注意:不要混用Jakarta和javax命名空间的依赖,避免版本冲突。

内容的提问来源于stack exchange,提问作者Mahajan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 04:04:58