JAXB недоступен в Tomcat 9 и Java 9/10.JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 JAXB недоступен в Tomcat 9 и Java 9/10.

Сообщение Anonymous »

TLDR. В Java 9/10 веб-приложение Tomcat не имеет доступа к JAXB, даже если его эталонная реализация присутствует в пути к классам.

Изменить: Нет, это не дубликат статьи «Как разрешить java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException в Java 9» — как вы можете видеть по Что я пробовал я уже пробовал предложенные решения.

Ситуация

Мы у вас есть веб-приложение, работающее на Tomcat и зависящее от JAXB. Во время миграции на Java 9 мы решили добавить эталонную реализацию JAXB в качестве обычной зависимости.

Все работало при запуске приложения из IDE со встроенным Tomcat, но при запуске это на реальном экземпляре Tomcat, я получаю эту ошибку:

Код: Выделить всё

Caused by: java.lang.RuntimeException: javax.xml.bind.JAXBException:
Implementation of JAXB-API has not been found on module path or classpath.
- with linked exception:
[java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory]
at [... our-code ...]
Caused by: javax.xml.bind.JAXBException: Implementation of JAXB-API has not been found on module path or classpath.
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:278) ~[jaxb-api-2.3.0.jar:2.3.0]
at javax.xml.bind.ContextFinder.find(ContextFinder.java:421) ~[jaxb-api-2.3.0.jar:2.3.0]
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:721) ~[jaxb-api-2.3.0.jar:2.3.0]
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:662) ~[jaxb-api-2.3.0.jar:2.3.0]
at [... our-code ...]
Caused by: java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory
at jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582) ~[?:?]
at jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:190) ~[?:?]
at java.lang.ClassLoader.loadClass(ClassLoader.java:499) ~[?:?]
at javax.xml.bind.ServiceLoaderUtil.nullSafeLoadClass(ServiceLoaderUtil.java:122) ~[jaxb-api-2.3.0.jar:2.3.0]
at javax.xml.bind.ServiceLoaderUtil.safeLoadClass(ServiceLoaderUtil.java:155) ~[jaxb-api-2.3.0.jar:2.3.0]
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:276) ~[jaxb-api-2.3.0.jar:2.3.0]
at javax.xml.bind.ContextFinder.find(ContextFinder.java:421) ~[jaxb-api-2.3.0.jar:2.3.0]
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:721) ~[jaxb-api-2.3.0.jar:2.3.0]
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:662) ~[jaxb-api-2.3.0.jar:2.3.0]
at [... our-code ...]
Примечание:


Реализация JAXB-API не обнаружена в модуле путь или путь к классу.


Это соответствующие файлы в webapps/$app/WEB-INF/lib:

Код: Выделить всё

jaxb-api-2.3.0.jar
jaxb-core-2.3.0.jar
jaxb-impl-2.3.0.jar
Что здесь происходит?

Что я пробовал

Добавление JAR-файлов в путь к классам Tomca

Может быть, поможет добавление JAR-файлов в путь к классам Tomcat в setenv.sh?? р>

Код: Выделить всё

CLASSPATH=
.../webapps/$app/WEB-INF/lib/jaxb-api-2.3.0.jar:
.../webapps/$app/WEB-INF/lib/jaxb-impl-2.3.0.jar:
.../webapps/$app/WEB-INF/lib/jaxb-core-2.3.0.jar:
.../webapps/$app/WEB-INF/lib/javax.activation-1.2.0.jar
Нет:

Код: Выделить всё

Caused by: javax.xml.bind.JAXBException: ClassCastException: attempting to cast
jar:file:.../webapps/$app/WEB-INF/lib/jaxb-api-2.3.0.jar!/javax/xml/bind/JAXBContext.class to
jar:file:.../webapps/$app/WEB-INF/lib/jaxb-api-2.3.0.jar!/javax/xml/bind/JAXBContext.class.
Please make sure that you are specifying the proper ClassLoader.
at javax.xml.bind.ContextFinder.handleClassCastException(ContextFinder.java:157) ~[jaxb-api-2.3.0.jar:2.3.0]
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:300) ~[jaxb-api-2.3.0.jar:2.3.0]
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:286) ~[jaxb-api-2.3.0.jar:2.3.0]
at javax.xml.bind.ContextFinder.find(ContextFinder.java:409) ~[jaxb-api-2.3.0.jar:2.3.0]
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:721) ~[jaxb-api-2.3.0.jar:2.3.0]
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:662) ~[jaxb-api-2.3.0.jar:2.3.0]
at de.disy.gis.webmapserver.factory.DefaultWmsRequestFactory.initializeCommandExtractor(DefaultWmsRequestFactory.java:103) ~[cadenza-gis-webmapserver-7.7-SNAPSHOT.jar:7.6]
at de.disy.gis.webmapserver.factory.DefaultWmsRequestFactory.lambda$new$0(DefaultWmsRequestFactory.java:87) ~[cadenza-gis-webmapserver-7.7-SNAPSHOT.jar:7.6]
Очевидно, это один и тот же класс, поэтому, очевидно, он был загружен двумя загрузчиками классов. Я подозреваю, что это загрузчик системных классов и загрузчик классов приложения, но почему загрузка JAXBContext делегируется загрузчику системных классов один раз, а не всегда? Похоже, что поведение делегирования загрузчика классов приложения меняется во время работы программы.

Добавление модуля

Мне не очень хочется добавлять java.xml.bind, но я все равно попробовал, добавив это в catalina.sh:

Код: Выделить всё

JDK_JAVA_OPTIONS="$JDK_JAVA_OPTIONS --add-modules=java.xml.bind"
Однако это тоже не работает:

Код: Выделить всё

Caused by: java.lang.ClassCastException:
java.xml.bind/com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl
cannot be cast to com.sun.xml.bind.v2.runtime.JAXBContextImpl
at [... our-code ...]
Помимо другой трассировки классов и стека, это соответствует тому, что произошло ранее: класс JAXBContextImpl был загружен дважды, один раз из java .xml.bind (должно быть, это был загрузчик системных классов) и еще раз (я предполагаю, что это загрузчик приложения из JAR).

Поиск ошибки

При поиске в базе данных ошибок Tomcat я нашел #62559. Может ли это быть та же ошибка?

Добавление JAR-файлов в библиотеку Tomcat

Следуя советам, данным на список рассылки пользователей Tomcat, я добавил файлы JAXB JAR в каталог Tomcat CATALINA_BASE/lib, но получил ту же ошибку, что и в папке lib приложения.

Подробнее здесь: https://stackoverflow.com/questions/515 ... -java-9-10
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»