【问题标题】:JDK 11: java.lang.NoClassDefFoundError: javax/xml/ws/handler/soap/SOAPHandlerJDK 11:java.lang.NoClassDefFoundError:javax/xml/ws/handler/soap/SOAPHandler
【发布时间】:2018-12-05 23:19:27
【问题描述】:

我们正在从 jdk 8 迁移到 openjdk 11。我们的一些使用soap调用第三方api的项目失败并出现错误:

java.lang.NoClassDefFoundError: javax/xml/ws/handler/soap/SOAPHandler

做了一些研究后,我尝试添加依赖项:

[ 参考:

]

 <dependency>
        <groupId>javax.annotation</groupId>
        <artifactId>javax.annotation-api</artifactId>
    </dependency>
    <dependency>
        <groupId>xml-apis</groupId>
        <artifactId>xml-apis</artifactId>
    </dependency>
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.1</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-core</artifactId>
        <version>2.3.0.1</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <version>2.3.1</version>
    </dependency>
    <dependency>
        <groupId>javax.xml.soap</groupId>
        <artifactId>javax.xml.soap-api</artifactId>
        <version>1.3.5</version>
    </dependency>

没有用。我可以对替代方案有所了解吗?

【问题讨论】:

  • 可能会显示一个引发java.lang.NoClassDefFoundError 的代码的sn-p。类似于MCVE
  • 您似乎忘记包含jaxws-api

标签: java


【解决方案1】:

在您的依赖项中包含jaxws-api

<dependency>
    <groupId>javax.xml.ws</groupId>
    <artifactId>jaxws-api</artifactId>
    <version>2.3.1</version>
</dependency>

【讨论】:

  • 如果您使用 Microsoft EWS 库并且遇到相同的异常,则此依赖项有助于解决问题。
【解决方案2】:

javax API 已转换为 Jakarta,因此在 2020 年,正确的依赖关系如下:

<dependency>
    <groupId>jakarta.xml.ws</groupId>
    <artifactId>jakarta.xml.ws-api</artifactId>
    <version>2.3.3</version>
</dependency>

这里有一篇文章总结了发生的事情: Java Magazine - Transition from Java EE to Jakarta EE

这是旧工件和新工件之间的very useful table with mappings

【讨论】:

    【解决方案3】:

    由于这是 google 上的第一个结果,我的问题是由于在 Tomcat 公用文件夹 /usr/local/tomcat/lib 上有一个需要 javax.xml.ws 类的 jar。

    Tomcat classloader hierarchy

          Bootstrap
              |
           System
              |
           Common
           /     \
      Webapp1   Webapp2 ...
    

    在 Java 8 上,通用类加载器可以加载这些类,因为它们在 Java JRE 本身上,但在 Java 11 上,javax.xml.ws 类在 Webapp1 上,而 Tomcat 通用类加载器无法加载这些。

    对我来说,解决方案是不再将 jar 部署到 Tomcat 公用 lib 文件夹中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-15
      • 1970-01-01
      • 2014-08-07
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-16
      相关资源
      最近更新 更多