wsimport 异常“线程“主”java.lang.NoClassDefFoundError 中出现异常:com/sun/xml/bind/api/ErrorListener”

问题描述 投票:0回答:1

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 有新版本吗?

wsimport
1个回答
0
投票

答案参考自这个答案: 安装 Metro-jax-ws 并运行 wsimport 问题 - Jack

我已将相关详情更新至最新版本。

下载 Metro-jax-ws 源代码

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

解压 Metro-jax-ws-4.0.2

编译并安装

cd metro-jax-ws-4.0.2/jaxws-ri/bundles

mvn install

获取工具zip

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包。

运行测试 helloworld 服务

./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

HelloWorld.java

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

© www.soinside.com 2019 - 2024. All rights reserved.