You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JDK11运行JDK8第三方包出现ClassNotFoundException问题求助

解决JDK11运行JDK8第三方包时的NoClassDefFoundError问题

问题分析

你遇到的java.lang.NoClassDefFoundError: com/sun/xml/internal/messaging/saaj/util/ByteOutputStream错误,本质是JDK 9及以后版本移除了com.sun.xml.internal开头的内部API模块,而你使用的第三方SDK硬编码依赖了这些JDK内部类。虽然你已经引入了公开的saaj-impl依赖,但第三方代码调用的路径是带internal的内部包,和公开依赖的包路径不匹配,所以无法找到类。

解决方案

  • 调整依赖并指定SAAJ实现类
    确保你的Maven依赖包含saaj-api和正确版本的saaj-impl,同时通过系统属性指定SAAJ的实现工厂:

    <dependency>
        <groupId>javax.xml.soap</groupId>
        <artifactId>saaj-api</artifactId>
        <version>1.4.0</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.messaging.saaj</groupId>
        <artifactId>saaj-impl</artifactId>
        <version>3.0.0</version>
        <scope>runtime</scope>
    </dependency>
    

    然后在项目运行时添加JVM参数:

    -Djavax.xml.soap.SAAJMetaFactory=com.sun.xml.messaging.saaj.soap.SAAJMetaFactoryImpl
    
  • 添加JVM包导出参数
    如果上述方法无效,直接通过JVM参数将JDK内部的com.sun.xml.internal.messaging.saaj.util包导出到应用类路径,让第三方代码可以访问到:

    --add-modules java.xml.ws
    --add-exports java.xml.ws/com.sun.xml.internal.messaging.saaj.util=ALL-UNNAMED
    
  • 排查依赖冲突
    执行Maven命令查看依赖树,检查是否有旧版本的saaj-impl或相关依赖被间接引入,导致版本冲突:

    mvn dependency:tree
    

    如果发现冲突,在saaj-impl依赖中添加exclusions排除冲突的依赖项。

内容的提问来源于stack exchange,提问作者JAX WONG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 09:07:44