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

OpenJDK 11:java.lang.NoClassDefFoundError:jakarta/xml/ws/Service调用SOAP web服务时,java,jakarta-ee,soap,jax-ws,openjdk-11,Java,Jakarta Ee,Soap,Jax Ws,Openjdk 11,我正在尝试迁移一个调用SOAP web服务的Oracle JDK 8应用程序,以采用OpenJDK 11(JDK-11.0.8.10-hotspot)。我从中下载了jaxws-ri-3.0.0-M4,在WSDL文件上运行了wsimport,它生成了一系列代理类(与我之前的类似,但具有不同的包引用),我将jaxws-ri-3.0.0-M4中的jar添加到项目中,在应用程序中更新了包导入的名称,并且构建良好(没有编译错误)。但是,当我从Eclipse运行应用程序时,会出现以下错误: Exceptio

我正在尝试迁移一个调用SOAP web服务的Oracle JDK 8应用程序,以采用OpenJDK 11(
JDK-11.0.8.10-hotspot
)。我从中下载了
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
如果我选择
服务
类并从上下文菜单中选择打开声明选项,它会将我带到
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;
保存
服务
类实现的JAR就在那里,那么我为什么会遇到这个错误呢

我读了多篇文章(StackOverflow、GitHub等),这些文章讨论了迁移到JDK 11的应用程序所引起的类似问题,但我找不到适合我的解决方案。大多数文章都建议定义适当的Maven依赖项,但我们的应用程序没有使用Maven(这超出了我的控制范围),所以我只是手动复制了JAR,我认为也会这样做

我有什么遗漏吗?有没有更好的方法从Java调用SOAP web服务?我花了一段时间才弄明白如何使用OracleJDK8,但最终还是成功了,我完全无法用OpenJDK11做同样的事情

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


谢谢。

JavaEE已迁移到eclipse并重命名。因此,您需要一个与运行时同步的wsimport步骤。最简单的可能是暂时使用Java8。@ThorbjørnRavnAndersen:谢谢。你是说这是因为我使用的wsimport不是来自OpenJDK吗?换句话说,wsimport和OpenJdk必须来自同一个供应商?我知道人们在迁移到JDK11之后能够调用SOAP web服务。这是因为他们使用的不是OpenJDK吗?你的项目使用的是Maven还是Gradle?@Boris:不,我们没有。我正在用一个简单的独立应用程序来测试这一点,所以我可以灵活地使用它,但我最终不得不将它合并到一个由更大的组织拥有的项目中,并且它没有使用任何依赖框架(maven等)。@AlekDavis M4位意味着它是里程碑4,而不是一个已完成的版本-使用旧版本。仔细阅读发行说明,以确保获得Java11所需的内容,因为标准运行时已大幅精简。