После обновления с Java 8 до Java 11 получено нарушение ограничения загрузчика - PullRequest
2 голосов
/ 20 января 2020

Я обновляю приложение «Бегемот» с Java 8 до Java 11 . Мы все еще строим с Java 8 , но работаем с Java 11 .

Я вижу, что класс загружается неправильно из-за нарушения ограничения загрузчика. Кодовая база импортирует этот класс через jar-файл в зависимости от maven. Если мы удалим jar-файл перед запуском приложения, проблема исчезнет.

Ошибка ниже:

Нарушение ограничения загрузчика: загрузчик 'bootstrap' хочет загрузить интерфейс org .w3 c .dom.traversal.NodeIterator. Другой интерфейс с тем же именем ранее был загружен com.app.CustomClassLoader @ 9626f9, родительский загрузчик java. net .URLClassLoader @ 13afaa3)

Я обнаружил, что ранее этот класс был загружен первым загрузчиком класса bootstrap. Теперь он сначала загружается загрузчиком пользовательских приложений. Разница в порядке ниже:

Java 8:

INFO | JVM 1 | 2020/01/08 11: 34: 30.626 | [Загруженный org.w3 c .dom.traversal.NodeIterator из /java-1.8.0_221.i586/jre/lib/rt.jar] INFO | JVM 1 | 2020/01/08 11: 34: 34.184 | [Загруженный org.dom4j.NodeIterator из файла: / webapps / lib / dom4j-xxxjar]

In Java 11

INFO | JVM 1 | 2020/01/07 17: 45: 49.426 | [3.787s] [info
] [class, load] org.dom4j.NodeIterator источник: файл: / webapps / lib / dom4j-xxxjar INFO | JVM 1 | 2020/01/07 17: 46: 15,772 | [30.210s] [info] [class, load] org.w3 c .dom.traversal.NodeIterator источник: файл: / webapps / lib / xml -xxxjar INFO | JVM 1 | 2020/01/07 17: 46: 15,772 | [30.210s] [info] [class, load] org.w3 c .dom.traversal.NodeIterator источник: jrt: / java. xml

Удаление вручную xml-x.x.x.jar до запуска предотвращает это. Я пытаюсь решить эту проблему, не удаляя эту банку или зависимость. Есть ли способ заставить загрузчик класса bootstrap сначала загрузить файл xml-x.x.x.jar? Я попытался добавить файл jar в путь загрузки, но это не помогло.

1 Ответ

1 голос
/ 20 января 2020

Если вам нужен этот артефакт только во время сборки, вы можете изменить его область на предоставленную <scope>provided</scope>, таким образом maven не будет загружать эту зависимость для времени выполнения

...