将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.
我读了Dealing with "Xerces hell" in Java/Maven?并尝试排除xml-apis但xerces-impl抛出NoClassDefFoundError。在jre / lib / endorsed中复制xml-apis和xerces-impl也会抛出ClassCastException(http://docs.oracle.com/javase/6/docs/technotes/guides/standards/)。
在启动命令抛出时添加-Djavax.xml.datatype.DatatypeFactory = com.sun.org.apache.xerces.internal.jaxp.datatype.DatatypeFactoryImpl:
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抛出:
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)
我不知道接下来该做什么。有什么想法吗?
答案 0 :(得分:1)
WebLogic在类路径中包含了许多这些库的版本,&amp;他们可以干扰你的应用程序。尝试将这样的部分添加到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的软件包;我不确定它们对于xerces会是什么。如果您有权访问wls-cat tool,那么应该有助于解决问题。
更新
WLS与您的应用之间的类路径冲突可以通过三种方式之一修复。
<prefer-application-packages>
元素,以便应用优先provided
我建议将mvn dependency:tree
与之前版本的OpenSAML一起使用,请注意依赖项。然后转到新的OpenSAML版本,&amp;请注意引入了哪些新的依赖项。查看WLS服务器的modules
目录以查看WLS正在使用的库,使用新的OpenSAML版本交叉引用此更改的依赖项,并确定3种可能性似乎是最合适的。例如,如果您可以看到WLS使用比您的应用程序更早版本的lib,您可能希望使用选项1.执行此操作直到您可以部署应用程序,然后使用wls-cat完成作业。
答案 1 :(得分:0)
除了javax.xml.bind作为prefer-application
<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>