从 Java 8 升级到 Java 11 后收到加载程序约束冲突
After upgrading from Java 8 to Java 11 receiving a loader constraint violation
我正在将一个庞然大物的应用程序从 Java 8 升级到 Java 11。我们仍在构建 Java 8,但 运行 Java 11。
我看到 class 由于违反加载程序约束而未正确加载。代码库通过 maven 依赖项中的 jar 文件导入此 class。如果我们在启动应用程序之前删除 jar 文件,问题就会消失。
错误如下:
loader constraint violation: loader 'bootstrap' wants to load
interface org.w3c.dom.traversal.NodeIterator. A different interface
with the same name was previously loaded by com.app.CustomClassLoader
@9626f9, parent loader java.net.URLClassLoader @13afaa3)
我发现之前这个class是由bootstrapclass加载器先加载的。现在它首先由自定义应用程序加载器加载。顺序差异如下:
Java 8:
INFO | jvm 1 | 2020/01/08 11:34:30.626 | [Loaded
org.w3c.dom.traversal.NodeIterator from
/java-1.8.0_221.i586/jre/lib/rt.jar] INFO | jvm 1 | 2020/01/08
11:34:34.184 | [Loaded org.dom4j.NodeIterator from
file:/webapps/lib/dom4j-x.x.x.jar]
在Java11
INFO | jvm 1 | 2020/01/07 17:45:49.426 | [3.787s][info
][class,load] org.dom4j.NodeIterator source:
file:/webapps/lib/dom4j-x.x.x.jar INFO | jvm 1 | 2020/01/07
17:46:15.772 | [30.210s][info ][class,load ]
org.w3c.dom.traversal.NodeIterator source:
file:/webapps/lib/xml-x.x.x.jar INFO | jvm 1 | 2020/01/07
17:46:15.772 | [30.210s][info ][class,load ]
org.w3c.dom.traversal.NodeIterator source: jrt:/java.xml
在启动前手动删除 xml-x.x.x.jar
可以防止这种情况发生。我试图在不删除那个 jar 或依赖项的情况下解决这个问题。有没有办法强制 bootstrap class 加载程序首先加载 xml-x.x.x.jar
文件?我尝试在 bootclasspath 中添加 jar 文件,但没有解决它。
如果您仅在构建期间需要此工件,您可以将其范围更改为提供
<scope>provided</scope>
,这样maven就不会在运行时加载这个依赖
我正在将一个庞然大物的应用程序从 Java 8 升级到 Java 11。我们仍在构建 Java 8,但 运行 Java 11。
我看到 class 由于违反加载程序约束而未正确加载。代码库通过 maven 依赖项中的 jar 文件导入此 class。如果我们在启动应用程序之前删除 jar 文件,问题就会消失。
错误如下:
loader constraint violation: loader 'bootstrap' wants to load interface org.w3c.dom.traversal.NodeIterator. A different interface with the same name was previously loaded by com.app.CustomClassLoader @9626f9, parent loader java.net.URLClassLoader @13afaa3)
我发现之前这个class是由bootstrapclass加载器先加载的。现在它首先由自定义应用程序加载器加载。顺序差异如下:
Java 8:
INFO | jvm 1 | 2020/01/08 11:34:30.626 | [Loaded org.w3c.dom.traversal.NodeIterator from /java-1.8.0_221.i586/jre/lib/rt.jar] INFO | jvm 1 | 2020/01/08 11:34:34.184 | [Loaded org.dom4j.NodeIterator from file:/webapps/lib/dom4j-x.x.x.jar]
在Java11
INFO | jvm 1 | 2020/01/07 17:45:49.426 | [3.787s][info
][class,load] org.dom4j.NodeIterator source: file:/webapps/lib/dom4j-x.x.x.jar INFO | jvm 1 | 2020/01/07 17:46:15.772 | [30.210s][info ][class,load ] org.w3c.dom.traversal.NodeIterator source: file:/webapps/lib/xml-x.x.x.jar INFO | jvm 1 | 2020/01/07 17:46:15.772 | [30.210s][info ][class,load ] org.w3c.dom.traversal.NodeIterator source: jrt:/java.xml
在启动前手动删除 xml-x.x.x.jar
可以防止这种情况发生。我试图在不删除那个 jar 或依赖项的情况下解决这个问题。有没有办法强制 bootstrap class 加载程序首先加载 xml-x.x.x.jar
文件?我尝试在 bootclasspath 中添加 jar 文件,但没有解决它。
如果您仅在构建期间需要此工件,您可以将其范围更改为提供
<scope>provided</scope>
,这样maven就不会在运行时加载这个依赖