OpenJDK 11:调用SOAP Web服务时出现java.lang.NoClassDefFoundError:jakarta / xml / ws / Service

问题描述

我正在尝试将调用SOAP Web服务的Oracle JDK 8应用程序迁移到采用OpenJDK 11(jdk-11.0.8.10-hotspot)。我从Maven repository下载了jaxws-ri-3.0.0-M4,在WSDL文件上运行了wsimport,它生成了一堆代理类(类似于我以前使用的代理类,但是具有不同的包引用),我添加了从jaxws-ri-3.0.0-M4到项目的JAR,更新了应用程序中包导入的名称,并且构建良好(没有编译错误)。但是当我从Eclipse运行应用程序时,出现以下错误

Exception in thread "main" java.lang.NoClassDefFoundError: jakarta/xml/ws/Service
    at java.base/java.lang.classLoader.defineClass1(Native Method)
    at java.base/java.lang.classLoader.defineClass(ClassLoader.java:1017)
    at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
    at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:800)
    at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClasspathOrNull(BuiltinClassLoader.java:698)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:621)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:579)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.classLoader.loadClass(ClassLoader.java:522)
    at net.codejava.Test.main(Test.java:31)
Caused by: java.lang.classNotFoundException: jakarta.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

看起来异常是由应用程序试图实例化wsimport生成的Web服务客户端代理类引起的。

程序代码

TestWS ws = new TestWS(wsdlUrl);

代理类:

public class TestWS
    extends Service

如果我选择Service类并从上下文菜单中选择 Open Declaration 选项,它将带我到jakarta.xml.ws-api.jar元数据:

// Compiled from Service.java (version 1.8 : 52.0,super bit)
public class jakarta.xml.ws.Service {
  
  // Field descriptor #34 Ljakarta/xml/ws/spi/ServiceDelegate;
  private jakarta.xml.ws.spi.ServiceDelegate delegate;

存在Service类实现的JAR,那么为什么会出现此错误

我阅读了多篇文章(StackOverflow,GitHub等),这些文章解决了由应用迁移到JDK 11引起的类似问题,但是我找不到适合我的解决方案。大多数文章建议定义适当的Maven依赖关系,但是我们的应用程序未使用Maven(这不在我的控制范围内),因此我只是手动复制了JAR,我认为这样做也可以。

有什么我想念的吗?是否有更好的方法从Java调用SOAP Web服务?我花了一段时间才弄清楚如何使用Oracle JDK 8进行操作,但最终它起作用了,而我完全想尝试使用OpenJDK 11进行操作。

请记住,我不精通Java(我有多年的.NET经验,但这是我的第一份Java作业)。

谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)