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
相关产品推荐
相关产品推荐

