我正在将一个庞然大物应用程序从Java 8升级到Java 11。我们仍然使用Java 8构建,但使用Java 11运行。
由于加载程序违反约束,我看到一个类没有正确加载。代码库通过maven依赖项中的jar文件导入该类。如果我们在启动应用程序之前删除jar文件,问题就会消失。
错误如下:
加载程序违反约束:加载程序‘引导’希望加载接口org.w3c.dom.traversal.NodeIterator。以前由com.app.CustomClassLoader @9626f9 (父加载程序java.net.URLClassLoader @13afa3)加载了同名的不同接口)
我发现以前这个类是由引导类加载器首先加载的。现在,它首先由自定义应用程序加载程序加载。顺序差异如下:
Java 8:
/java-1.8.0_221.i586/jre/lib/rt.jar信息/jre/lib/rt.jar信息/ jvm 1区2020/01/08 11:34:34.184加载了org.w3c.dom.traversal.NodeIterator文件:/webapp/lib/dom4j-x.jar
在Java 11中
信息org.dom4j.NodeIterator源文件:/org.dom4j.NodeIterator源文件:/webapp/lib/dom4j-x.jar加载org.w3c.dom.traversal.NodeIterator源文件:/webapp/lib/xml-x.jar INFO \ jvm 1 2020/01/07 17:46:15.772 AC.26 30.210 source,load org.w3c.dom.traversal.NodeIterator源代码: jrt:/java.xml
启动前手动删除xml-x.x.x.jar可防止这种情况发生。我试图在不删除jar或依赖项的情况下解决这个问题。是否有办法迫使引导类加载器首先加载xml-x.x.x.jar文件?我尝试在引导路径中添加jar文件,但是它没有解决这个问题。
发布于 2020-01-20 13:21:11
如果仅在构建过程中需要此工件,则可以将其作用域更改为提供的<scope>provided</scope>,这样maven就不会为运行时加载此依赖项
https://stackoverflow.com/questions/59817466
复制相似问题