Конфликты между JDK6 и xml-apis

1

После обновления OpenSAML с 1.1 до 2.6.1, для которого требуется зависимость xerces-impl, при запуске появляется следующий стек:

 Caused by: java.lang.ClassCastException: org.apache.xerces.jaxp.datatype.DatatypeFactoryImpl cannot be cast to javax.xml.datatype.DatatypeFactory
       at javax.xml.datatype.DatatypeFactory.newInstance(DatatypeFactory.java:131) ~[xml-apis-1.4.01.jar:1.6.0_45]
       at com.sun.xml.bind.DatatypeConverterImpl.<clinit>(DatatypeConverterImpl.java:831) ~[glassfish.jaxb_1.0.0.0_2-1-12.jar:2.1.12]
       ... 68 common frames omitted

xerces-impl переопределяет некоторые классы jre и поставляется с xml-apis, которые переопределяют некоторые jre-интерфейсы. org.apache.xerces.jaxp.datatype.DatatypeFactoryImpl исходит из xerces-impl.

Я нахожусь в weblogic 10.3.5 и JDK 6.

Я прочитал " Работа с" Xerces hell "в Java/Maven? и попытайтесь исключить xml-apis, но xerces-impl выдает NoClassDefFoundError. Копирование xml-apis и xerces-impl в jre/lib/endorsed также вызывает ClassCastException (http://docs.oracle.com/javase/6/docs/technotes/guides/standards/).

Добавление -Djavax.xml.datatype.DatatypeFactory = com.sun.org.apache.xerces.internal.jaxp.datatype.DatatypeFactoryImpl при запуске команды throw:

 Caused by: java.lang.ClassCastException: org.apache.xerces.jaxp.SAXParserFactoryImpl cannot be cast to javax.xml.parsers.SAXParserFactory
    at javax.xml.parsers.SAXParserFactory.newInstance(SAXParserFactory.java:128) ~[xml-apis-1.4.01.jar:1.6.0_45]
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.getXMLReader(AbstractUnmarshallerImpl.java:80) ~[na:1.6.0_45]

Затем добавьте -Djavax.xml.parsers.SAXParserFactory = com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl throws:

 Caused by: java.lang.ClassCastException: com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl cannot be cast to javax.xml.parsers.SAXParserFactory
    at javax.xml.parsers.SAXParserFactory.newInstance(Unknown Source)
    at ch.qos.logback.core.joran.event.SaxEventRecorder.buildSaxParser(SaxEventRecorder.java:79)

Я не знаю, что делать дальше. Есть идеи?

Теги:
classloader
weblogic
opensaml
xerces

2 ответа

0
Лучший ответ

В дополнение к javax.xml.bind в качестве предпочтительного приложения

<wls:package-name>javax.xml.bind.*</wls:package-name>

в weblogic.xml, добавление jaxb-зависимостей решило мою проблему:

<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>${jaxb-impl.version}</version>
</dependency>
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>${jaxb-api.version}</version>
</dependency>
1

WebLogic включает в себя собственные версии многих этих библиотек на пути к классам, и они могут помешать вашему приложению. Попробуйте добавить такой раздел в файл weblogic.xml:

<weblogic-web-app>

  <container-descriptor>
    <prefer-application-packages>
        <package-name>org.slf4j.*</package-name>
        <package-name>org.slf4j.helpers.*</package-name>
        <package-name>org.slf4j.impl.*</package-name>
        <package-name>org.slf4j.spi.*</package-name>
    </prefer-application-packages>
  </container-descriptor>
  ...
</weblogic-web-app>

В этом примере показаны пакеты для slf4j; Я не уверен, что они будут для ксерок. Если у вас есть доступ к инструменту wls-cat, это должно помочь понять это.


Обновить

Способы сопоставления классов между WLS и вашим приложением могут быть исправлены одним из трех способов.

  1. Добавьте пакет в элемент <prefer-application-packages> чтобы приложение имело приоритет
  2. Измените POM, чтобы отметить, что определенная зависимость provided WLS
  3. Исключить зависимость от POM целиком.

Я предлагаю использовать mvn dependency:tree с прежней версией OpenSAML, обратите внимание на зависимости. Затем перейдите к новой версии OpenSAML и обратите внимание на то, какие новые зависимости втянуты. Взгляните на каталог modules серверов WLS, чтобы узнать, какие библиотеки WLS используют, перекрестно ссылайтесь на это с измененными зависимостями с новой версией OpenSAML и решайте какая из трех возможностей кажется наилучшей. Например, если вы видите, что WLS использует более раннюю версию lib, чем ваше приложение, вы, вероятно, захотите использовать опцию 1. Сделайте это, пока вы не сможете запустить приложение, а затем используйте wls-cat для завершения задания.

  • 0
    Я добавил: <wls: предпочитаемое приложение-пакеты> <wls: имя-пакета> javax.xml.parsers. * </ Wls: имя-пакета> </ wls: предпочитайте-пакеты-приложения>, но у меня все еще есть исключение ClassCastException , Поскольку он не запускается, я не вижу информации о моем приложении в wls-cat. Поскольку SAXParserFactory происходит из xml-apis, я не понимаю, как я могу получить ClassCastException с реализацией xerces в 2 первых StackTraces.
  • 0
    Вы также удалили все дополнительные параметры -D, добавленные вами ранее при устранении неполадок? Мой опыт это ничего из того, что нужно. Обратите внимание, что в исключении classpath упоминается org.apache.xerces . Это означает, что вам, вероятно, понадобится как минимум <package-name>org.apache.xerces.*</package-name> в файле weblogic.xml. Там могут быть другие, необходимые.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню