异常java.lang.ClassCastException org.apache.xml.dtm.ref.DTMManagerDefault incompatible with org.apache.xml.dtm.DTMManager的解决
1. 发生异常的环境
WebSphere Platform 8.5.0.0 [ND 8.5.0.0 gm1218.01]
IBM J9VM - R26_Java626_SR2_20120322_1722_B106210
应用的WEB Module的类加载器是Parent-Last
2. 异常日志
[14-2-19 17:40:17:270 CST] 00000045 CompositeDocu E org.apache.tuscany.sca.assembly.xml.CompositeDocumentProcessor ContributionReadException occurred due to : org.apache.tuscany.sca.contribution.service.ContributionReadException: java.lang.ClassCastException: org.apache.xml.dtm.ref.DTMManagerDefault incompatible with org.apache.xml.dtm.DTMManager [14-2-19 17:40:17:278 CST] 00000045 SystemOut O [default][2014-02-19 17:40:17,277][ERROR][com.primeton.sca.host.impl.EOSSCADomain:57] Generate the contributin 'file:/D:/IBM/WebSphere/AppServer/profiles/eos_profile/installedApps/ART02Node01Cell/default.ear/default.war/WEB-INF/_srv/work/system/com.primeton.bps.webservice/' error. org.apache.tuscany.sca.contribution.service.ContributionException: java.lang.IllegalArgumentException: Null InputStream is not a valid argument at org.apache.tuscany.sca.contribution.service.impl.ContributionServiceImpl.addContribution(ContributionServiceImpl.java:393) at org.apache.tuscany.sca.contribution.service.impl.ContributionServiceImpl.contribute(ContributionServiceImpl.java:189) at com.primeton.sca.host.impl.EOSSCADomain.buildContribution(EOSSCADomain.java:54) at com.primeton.sca.host.impl.EOSSCADomain.addContribution(EOSSCADomain.java:124) at com.primeton.ext.sca.host.ScaSystem.addContribution(ScaSystem.java:243) at com.primeton.sca.host.impl.SCAResourceLoadListener.load(SCAResourceLoadListener.java:59) at com.primeton.runtime.resource.impl.ResourceNotify.notifyResource(ResourceNotify.java:106) at com.primeton.runtime.resource.impl.ApplicationResourceLoaderManager.loadApplicationResource(ApplicationResourceLoaderManager.java:38) at com.primeton.ext.runtime.resource.startup.ResourceLoaderStartUpListener.start(ResourceLoaderStartUpListener.java:36) at com.primeton.runtime.core.impl.RuntimeListenerManagerImpl.startListener(RuntimeListenerManagerImpl.java:43) at com.primeton.ext.runtime.core.RuntimeManager.start(RuntimeManager.java:64) at com.primeton.ext.runtime.core.RuntimeJ2EEHost.contextInitialized(RuntimeJ2EEHost.java:52) at com.ibm.ws.webcontainer.webapp.WebApp.notifyServletContextCreated(WebApp.java:1651) at com.ibm.ws.webcontainer.webapp.WebAppImpl.initialize(WebAppImpl.java:414) at com.ibm.ws.webcontainer.webapp.WebGroupImpl.addWebApplication(WebGroupImpl.java:88) at com.ibm.ws.webcontainer.VirtualHostImpl.addWebApplication(VirtualHostImpl.java:169) at com.ibm.ws.webcontainer.WSWebContainer.addWebApp(WSWebContainer.java:749) at com.ibm.ws.webcontainer.WSWebContainer.addWebApplication(WSWebContainer.java:634) at com.ibm.ws.webcontainer.component.WebContainerImpl.install(WebContainerImpl.java:426) at com.ibm.ws.webcontainer.component.WebContainerImpl.start(WebContainerImpl.java:718) at com.ibm.ws.runtime.component.ApplicationMgrImpl.start(ApplicationMgrImpl.java:1170) at com.ibm.ws.runtime.component.DeployedApplicationImpl.fireDeployedObjectStart(DeployedApplicationImpl.java:1370) at com.ibm.ws.runtime.component.DeployedModuleImpl.start(DeployedModuleImpl.java:638) at com.ibm.ws.runtime.component.DeployedApplicationImpl.start(DeployedApplicationImpl.java:968) at com.ibm.ws.runtime.component.ApplicationMgrImpl.startApplication(ApplicationMgrImpl.java:769) at com.ibm.ws.runtime.component.ApplicationMgrImpl.start(ApplicationMgrImpl.java:2172) at com.ibm.ws.runtime.component.CompositionUnitMgrImpl.start(CompositionUnitMgrImpl.java:445) at com.ibm.ws.runtime.component.CompositionUnitImpl.start(CompositionUnitImpl.java:123) at com.ibm.ws.runtime.component.CompositionUnitMgrImpl.start(CompositionUnitMgrImpl.java:388) at com.ibm.ws.runtime.component.CompositionUnitMgrImpl.access$500(CompositionUnitMgrImpl.java:116) at com.ibm.ws.runtime.component.CompositionUnitMgrImpl$CUInitializer.run(CompositionUnitMgrImpl.java:994) at com.ibm.wsspi.runtime.component.WsComponentImpl$_AsynchInitializer.run(WsComponentImpl.java:349) at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1783) Caused by: java.lang.IllegalArgumentException: Null InputStream is not a valid argument at com.ctc.wstx.stax.WstxInputFactory.createSR(WstxInputFactory.java:614) at com.ctc.wstx.stax.WstxInputFactory.createXMLStreamReader(WstxInputFactory.java:317) at org.apache.tuscany.sca.contribution.processor.DefaultValidatingXMLInputFactory.createXMLStreamReader(DefaultValidatingXMLInputFactory.java:213) at org.apache.tuscany.sca.assembly.xml.CompositeDocumentProcessor.read(CompositeDocumentProcessor.java:116) at org.apache.tuscany.sca.assembly.xml.CompositeDocumentProcessor.read(CompositeDocumentProcessor.java:56) at org.apache.tuscany.sca.contribution.processor.ExtensibleURLArtifactProcessor.read(ExtensibleURLArtifactProcessor.java:96) at org.apache.tuscany.sca.contribution.service.impl.ContributionServiceImpl.processReadPhase(ContributionServiceImpl.java:496) at org.apache.tuscany.sca.contribution.service.impl.ContributionServiceImpl.addContribution(ContributionServiceImpl.java:391) ... 32 more 3. 异常分析 从这段日志中可以看出有2个异常: > java.lang.ClassCastException: org.apache.xml.dtm.ref.DTMManagerDefault incompatible with org.apache.xml.dtm.DTMManager > java.lang.IllegalArgumentException: Null InputStream is not a valid argument 查看代码发现是由于第一个异常造成了一个InputStream变量为null,从而引起第二个异常。 对于第一个异常首先怀疑的就是2个类的类加载器不是同一个,然后通过一个test.jsp测试发现这2个类都是同一个类加载器加载并且都是在同一个jar(WEB-INF/lib/xalan-2.5.0.jar)里, 这个测试结果不符合预期,按照这个测试结果不会出现ClassCast异常,而且异常栈里也没有发现ClassCast的具体调用位置,通过代码调试发现了异常栈如下: [org.apache.xml.dtm.DTMManager.newInstance(Unknown Source), org.apache.xpath.XPathContext.<init>(Unknown Source), org.apache.xpath.jaxp.XPathExpressionImpl.evaluate(Unknown Source), org.apache.tuscany.sca.policy.util.PolicyComputationUtils.addApplicablePolicySets(PolicyComputationUtils.java:304), org.apache.tuscany.sca.policy.util.PolicyComputationUtils.addApplicablePolicySets(PolicyComputationUtils.java:236), org.apache.tuscany.sca.policy.util.PolicyComputationUtils.addApplicablePolicySets(PolicyComputationUtils.java:349), org.apache.tuscany.sca.assembly.xml.CompositeDocumentProcessor.read(CompositeDocumentProcessor.java:98), org.apache.tuscany.sca.assembly.xml.CompositeDocumentProcessor.read(CompositeDocumentProcessor.java:56), org.apache.tuscany.sca.contribution.processor.ExtensibleURLArtifactProcessor.read(ExtensibleURLArtifactProcessor.java:96), org.apache.tuscany.sca.contribution.service.impl.ContributionServiceImpl.processReadPhase(ContributionServiceImpl.java:496), org.apache.tuscany.sca.contribution.service.impl.ContributionServiceImpl.addContribution(ContributionServiceImpl.java:391), org.apache.tuscany.sca.contribution.service.impl.ContributionServiceImpl.contribute(ContributionServiceImpl.java:189), com.primeton.sca.host.impl.EOSSCADomain.buildContribution(EOSSCADomain.java:54), com.primeton.sca.host.impl.EOSSCADomain.addContribution(EOSSCADomain.java:124), com.primeton.ext.sca.host.ScaSystem.addContribution(ScaSystem.java:243), com.primeton.sca.host.impl.SCAResourceLoadListener.load(SCAResourceLoadListener.java:59), com.primeton.runtime.resource.impl.ResourceNotify.notifyResource(ResourceNotify.java:106), com.primeton.runtime.resource.impl.ApplicationResourceLoaderManager.loadApplicationResource(ApplicationResourceLoaderManager.java:38), com.primeton.ext.runtime.resource.startup.ResourceLoaderStartUpListener.start(ResourceLoaderStartUpListener.java:36), com.primeton.runtime.core.impl.RuntimeListenerManagerImpl.startListener(RuntimeListenerManagerImpl.java:43), com.primeton.ext.runtime.core.RuntimeManager.start(RuntimeManager.java:64), com.primeton.ext.runtime.core.RuntimeJ2EEHost.contextInitialized(RuntimeJ2EEHost.java:52), com.ibm.ws.webcontainer.webapp.WebApp.notifyServletContextCreated(WebApp.java:1651), com.ibm.ws.webcontainer.webapp.WebAppImpl.initialize(WebAppImpl.java:414), com.ibm.ws.webcontainer.webapp.WebGroupImpl.addWebApplication(WebGroupImpl.java:88), com.ibm.ws.webcontainer.VirtualHostImpl.addWebApplication(VirtualHostImpl.java:169), com.ibm.ws.webcontainer.WSWebContainer.addWebApp(WSWebContainer.java:749), com.ibm.ws.webcontainer.WSWebContainer.addWebApplication(WSWebContainer.java:634), com.ibm.ws.webcontainer.component.WebContainerImpl.install(WebContainerImpl.java:426), com.ibm.ws.webcontainer.component.WebContainerImpl.start(WebContainerImpl.java:718), com.ibm.ws.runtime.component.ApplicationMgrImpl.start(ApplicationMgrImpl.java:1170), com.ibm.ws.runtime.component.DeployedApplicationImpl.fireDeployedObjectStart(DeployedApplicationImpl.java:1370), com.ibm.ws.runtime.component.DeployedModuleImpl.start(DeployedModuleImpl.java:638), com.ibm.ws.runtime.component.DeployedApplicationImpl.start(DeployedApplicationImpl.java:968), com.ibm.ws.runtime.component.ApplicationMgrImpl.startApplication(ApplicationMgrImpl.java:769), com.ibm.ws.runtime.component.ApplicationMgrImpl.start(ApplicationMgrImpl.java:2172), com.ibm.ws.runtime.component.CompositionUnitMgrImpl.start(CompositionUnitMgrImpl.java:445), com.ibm.ws.runtime.component.CompositionUnitImpl.start(CompositionUnitImpl.java:123), com.ibm.ws.runtime.component.CompositionUnitMgrImpl.start(CompositionUnitMgrImpl.java:388), com.ibm.ws.runtime.component.CompositionUnitMgrImpl.access$500(CompositionUnitMgrImpl.java:116), com.ibm.ws.runtime.component.CompositionUnitMgrImpl$CUInitializer.run(CompositionUnitMgrImpl.java:994), com.ibm.wsspi.runtime.component.WsComponentImpl$_AsynchInitializer.run(WsComponentImpl.java:349), com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1783)]
可以看到是由org.apache.xpath.XPathContext构造函数里调用了DTMManager.newInstance()。
org.apache.xpath.XPathContext是在IBM J9VM - R26_Java626_SR2_20120322_1722_B106210的bootclasspath里,而且bootclasspath中也包含org.apache.xml.dtm.DTMManager。
所以在WEB-INF/lib下又存在另一个DTMManager并且是Parent-Last的ClassLoader的情况下会造成和bootclasspath的冲突,出现ClassCast的错误。
4. 异常解决
可以删除xalan-2.5.0.jar。