我们使用Java 8和apache 2.7.0来将wsdl转换为Java,它工作得很好。现在我们要升级到java 11,然后得到错误消息。
如何使用wsdl2java Apache cxf 3.3。
步骤尝试。
Apache 3.3.0或Apache 3.3.1或Apache 3.3.2
当尝试使用下面的命令
转换时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
也尝试添加外部jar文件到CFX 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)
它不能在命令行中工作,而是我尝试在pom.xml中使用cxf-codegen-plugin
<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>
不同版本的Apache CFX 3.3。X不包含所有必需的库
注意:这些版本是存档的,Apache不支持。我没有比较所有版本的库。这些版本可能需要一些其他的库。
Apache CXF 3.3.0中缺少的库
- javax.xml.soap-api.1.4.0
- jakarta.xml.ws-api.2.3.3
Apache CXF 3.3.2中缺少的库
- jakarta.xml.ws-api.2.3.3
Apache CXF onjavax.*
namespace的最新版本是3.5.5
.
强烈建议升级CXF版本到3.5.5
。如果不可能,那么在./lib
文件夹下下载上述jar文件。
升级cxf-codegen-plugin
到3.3.5
将此依赖项添加到pom.xml
<dependency>
<groupId>jakarta.xml.ws</groupId>
<artifactId>jakarta.xml.ws-api</artifactId>
<version>${jakarta.xml.ws-api.version}</version>
</dependency>
选择合适的${jakarta.xml.ws-api.version}
是很重要的,因为对命名空间(包)的破坏性更改。
- 对于
javax.*
命名空间使用2.3.3
(基于堆栈跟踪,在这种情况下这是正确的选择) - 为
jakarta.*
命名空间使用3.x
或4.0.0