wsimport 已被弃用,因此我下载了具有 wsimport 的 JAX-WS RI 2.3.1。我的电脑正在运行:
java version "21.0.2" 2024-01-16 LTS
Java(TM) SE Runtime Environment (build 21.0.2+13-LTS-58)
Java HotSpot(TM) 64-Bit Server VM (build 21.0.2+13-LTS-58, mixed mode, sharing)
当我运行
wsimport -keep -verbose https://www.onvif.org/ver10/deviceio.wsdl
时,我得到以下信息:
Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/xml/bind/api/ErrorListener
at java.base/java.lang.ClassLoader.defineClass1(Native Method)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1027)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
at java.base/java.lang.ClassLoader.defineClass1(Native Method)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1027)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
at java.base/java.lang.Class.getDeclaredConstructors0(Native Method)
at java.base/java.lang.Class.privateGetDeclaredConstructors(Class.java:3549)
at java.base/java.lang.Class.getConstructor0(Class.java:3754)
at java.base/java.lang.Class.getConstructor(Class.java:2442)
at com.sun.tools.ws.Invoker.invoke(Invoker.java:150)
at com.sun.tools.ws.WsImport.main(WsImport.java:56)
Caused by: java.lang.ClassNotFoundException: com.sun.xml.bind.api.ErrorListener
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
... 24 more
当我使用本地 wsdl 文件时,我得到同样的结果。我怀疑这个错误与 WSDL 文件无关。 JDK 21 是否可能与 5、6 年前构建的 JAX-WS RI 2.3.1 不兼容?
wsimport 有新版本吗?
答案参考自这个答案: 安装 Metro-jax-ws 并运行 wsimport 问题 - Jack
我已将相关详情更新至最新版本。
https://github.com/eclipse-ee4j/metro-jax-ws/releases
下载 4.0.2 -> Metro-jax-ws-4.0.2.tar.gz 或 Metro-jax-ws-4.0.2.zip
cd metro-jax-ws-4.0.2/jaxws-ri/bundles
mvn install
cp ~/.m2/repository/com/sun/xml/ws/jaxws-ri/4.0.2/jaxws-ri-4.0.2.zip ./
unzip jaxws-ri-4.0.2.zip
cd jaxws-ri-4.0.2/jaxws-ri/bin
./wsimport.sh -keep -verbose https://www.onvif.org/ver10/deviceio.wsdl
题外话,你的wsdl有问题,会出现以下消息:
parsing WSDL...
[ERROR] Could not find wsdl:service in the provided WSDL(s):
https://www.onvif.org/ver10/deviceio.wsdl
At least one WSDL with at least one service definition needs to be provided.
Failed to parse the WSDL.
如果成功,将会生成相应的wsdl存根代码,使用jakarta包。
./wsimport.sh -keep -verbose http://localhost:8080/hello-ws/HelloWorld?wsdl
parsing WSDL...
Generating code...
com/example/ws/HelloWorld.java
com/example/ws/HelloWorldImplService.java
com/example/ws/ObjectFactory.java
com/example/ws/SayHello.java
com/example/ws/SayHelloResponse.java
com/example/ws/package-info.java
Compiling code...
javac -d /home/user123/jaxws-ri-4.0.2/jaxws-ri/bin/. -classpath /home/user123/jaxws-ri-4.0.2/jaxws-ri/lib/jaxws-tools.jar /home/user123/jaxws-ri-4.0.2/jaxws-ri/bin/./com/example/ws/HelloWorld.java /home/user123/jaxws-ri-4.0.2/jaxws-ri/bin/./com/example/ws/HelloWorldImplService.java /home/user123/jaxws-ri-4.0.2/jaxws-ri/bin/./com/example/ws/ObjectFactory.java /home/user123/jaxws-ri-4.0.2/jaxws-ri/bin/./com/example/ws/SayHello.java /home/user123/jaxws-ri-4.0.2/jaxws-ri/bin/./com/example/ws/SayHelloResponse.java /home/user123/jaxws-ri-4.0.2/jaxws-ri/bin/./com/example/ws/package-info.java
然后你可以找到
jaxws-ri-4.0.2/jaxws-ri/bin/com/example/ws
有一些.java
和.class
package com.example.ws;
import jakarta.jws.WebMethod;
import jakarta.jws.WebParam;
import jakarta.jws.WebResult;
import jakarta.jws.WebService;
import jakarta.xml.bind.annotation.XmlSeeAlso;
import jakarta.xml.ws.Action;
import jakarta.xml.ws.RequestWrapper;
import jakarta.xml.ws.ResponseWrapper;
/**
* This class was generated by the XML-WS Tools.
* XML-WS Tools 4.0.2
* Generated source version: 3.0
*
*/
@WebService(name = "HelloWorld", targetNamespace = "http://ws.example.com/")
@XmlSeeAlso({
ObjectFactory.class
})
public interface HelloWorld {
...
2024 更新 wsimport