【问题标题】:After upgrading from Java 8 to Java 11 receiving a loader constraint violation从 Java 8 升级到 Java 11 后收到加载程序约束违规
【发布时间】:2020-05-06 02:51:24
【问题描述】:

我正在将一个庞大的应用程序从 Java 8 升级到 Java 11。我们仍在使用 Java 8 构建,但使用 Java 11 运行。

我看到一个类由于违反加载程序约束而无法正确加载。代码库通过 Maven 依赖项中的 jar 文件导入此类。如果我们在启动应用程序之前删除 jar 文件,问题就会消失。

错误如下:

加载程序约束违规:加载程序“引导程序”要加载 接口 org.w3c.dom.traversal.NodeIterator。不一样的界面 com.app.CustomClassLoader 之前加载了同名的 @9626f9,父加载器 java.net.URLClassLoader @13afaa3)

我发现以前这个类是由引导类加载器首先加载的。现在它首先由自定义应用程序加载器加载。顺序差异如下:

Java 8:

信息 |虚拟机 1 | 2020/01/08 11:34:30.626 | [已加载 org.w3c.dom.traversal.NodeIterator 来自 /java-1.8.0_221.i586/jre/lib/rt.jar] 信息 |虚拟机 1 | 2020/01/08 11:34:34.184 | [从加载 org.dom4j.NodeIterator 文件:/webapps/lib/dom4j-x.x.x.jar]

Java 11

信息 |虚拟机 1 | 2020/01/07 17:45:49.426 | [3.787s][信息
][class,load] org.dom4j.NodeIterator 源码: 文件:/webapps/lib/dom4j-x.x.x.jar 信息 |虚拟机 1 | 2020/01/07 17:46:15.772 | [30.210s][信息][类,加载] org.w3c.dom.traversal.NodeIterator 源码: 文件:/webapps/lib/xml-x.x.x.jar 信息 |虚拟机 1 | 2020/01/07 17:46:15.772 | [30.210s][信息][类,加载] org.w3c.dom.traversal.NodeIterator 来源:jrt:/java.xml

在启动前手动删除xml-x.x.x.jar 可以防止这种情况发生。我正在尝试在不删除该 jar 或依赖项的情况下解决此问题。有没有办法强制引导类加载器首先加载xml-x.x.x.jar 文件?我尝试在 bootclasspath 中添加 jar 文件,但没有解决。

【问题讨论】:

  • 我应该补充一点,我们通过 maven 在多个地方加载 xml-x.x.x.jar 依赖项。由于在构建过程中严重依赖它,因此从 maven 依赖 pom 文件中删除它非常困难。
  • 这里有关于这个问题的任何更新吗?

标签: java maven classloader java-11


【解决方案1】:

如果您仅在构建期间需要此工件,您可以将其范围更改为提供 <scope>provided</scope>,这样maven就不会在运行时加载这个依赖了

【讨论】:

  • 这可行,但是如果您还想在 Java 8 和 Java 11 上运行,如果删除的依赖项包含 Java 8 没有的类,则可能会遇到问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-29
  • 2011-11-20
  • 1970-01-01
  • 2014-12-11
相关资源
最近更新 更多