После обновления 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)
Я не знаю, что делать дальше. Есть идеи?
В дополнение к 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>
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 и вашим приложением могут быть исправлены одним из трех способов.
<prefer-application-packages>
чтобы приложение имело приоритетprovided
WLS Я предлагаю использовать mvn dependency:tree
с прежней версией OpenSAML, обратите внимание на зависимости. Затем перейдите к новой версии OpenSAML и обратите внимание на то, какие новые зависимости втянуты. Взгляните на каталог modules
серверов WLS, чтобы узнать, какие библиотеки WLS используют, перекрестно ссылайтесь на это с измененными зависимостями с новой версией OpenSAML и решайте какая из трех возможностей кажется наилучшей. Например, если вы видите, что WLS использует более раннюю версию lib, чем ваше приложение, вы, вероятно, захотите использовать опцию 1. Сделайте это, пока вы не сможете запустить приложение, а затем используйте wls-cat для завершения задания.
org.apache.xerces
. Это означает, что вам, вероятно, понадобится как минимум<package-name>org.apache.xerces.*</package-name>
в файле weblogic.xml. Там могут быть другие, необходимые.