[jboss-user] [Installation, Configuration & DEPLOYMENT] - ClassCastException due to Xerces conflict during app deploym

rodos77 do-not-reply at jboss.com
Fri Jul 17 13:58:56 EDT 2009


JBoss: 5.1.0.GA
JDK:   1.5.0_11-b03
OS:    WinXP SP3

Hi,

I'm getting the dreaded ClassCastException when deploying my web app due to a conflict between XercesImpl.jar bundled with JBoss and another one inside my war file:

  | 13:00:45,353 INFO  [TomcatDeployment] deploy, ctxPath=/nexj-web
  | 13:00:45,462 ERROR [JBossContextConfig] XML error parsing: context.xml
  | org.jboss.xb.binding.JBossXBRuntimeException: Failed to create a new SAX parser
  |         at org.jboss.xb.binding.UnmarshallerFactory$UnmarshallerFactoryImpl.newUnmarshaller(UnmarshallerFactory.java:100)
  |         at org.jboss.web.tomcat.service.deployers.JBossContextConfig.processContextConfig(JBossContextConfig.java:549)
  |         at org.jboss.web.tomcat.service.deployers.JBossContextConfig.init(JBossContextConfig.java:536)
  |         at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:279)
  |         at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
  |         at org.apache.catalina.core.StandardContext.init(StandardContext.java:5436)
  |         at org.apache.catalina.core.StandardContext.start(StandardContext.java:4148)
  |         at org.jboss.web.tomcat.service.deployers.TomcatDeployment.performDeployInternal(TomcatDeployment.java:310)
  |         at org.jboss.web.tomcat.service.deployers.TomcatDeployment.performDeploy(TomcatDeployment.java:142)
  |         at org.jboss.web.deployers.AbstractWarDeployment.start(AbstractWarDeployment.java:461)
  |         at org.jboss.web.deployers.WebModule.startModule(WebModule.java:118)
  |         at org.jboss.web.deployers.WebModule.start(WebModule.java:97)
  |         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  |         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
  |         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
  |         at java.lang.reflect.Method.invoke(Method.java:585)
  |         at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:157)
  |         at org.jboss.mx.server.Invocation.dispatch(Invocation.java:96)
  |         at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
  |         at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
  |         at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:668)
  |         at org.jboss.system.microcontainer.ServiceProxy.invoke(ServiceProxy.java:206)
  |         at $Proxy38.start(Unknown Source)
  |         at org.jboss.system.microcontainer.StartStopLifecycleAction.installAction(StartStopLifecycleAction.java:42)
  |         at org.jboss.system.microcontainer.StartStopLifecycleAction.installAction(StartStopLifecycleAction.java:37)
  |         at org.jboss.dependency.plugins.action.SimpleControllerContextAction.simpleInstallAction(SimpleControllerContextAction.java:62)
  |         at org.jboss.dependency.plugins.action.AccessControllerContextAction.install(AccessControllerContextAction.java:71)
  |         at org.jboss.dependency.plugins.AbstractControllerContextActions.install(AbstractControllerContextActions.java:51)
  |         at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
  |         at org.jboss.system.microcontainer.ServiceControllerContext.install(ServiceControllerContext.java:286)
  |         at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1631)
  |         at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
  |         at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1082)
  |         at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
  |         at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
  |         at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
  |         at org.jboss.system.ServiceController.doChange(ServiceController.java:688)
  |         at org.jboss.system.ServiceController.start(ServiceController.java:460)
  |         at org.jboss.system.deployers.ServiceDeployer.start(ServiceDeployer.java:163)
  |         at org.jboss.system.deployers.ServiceDeployer.deploy(ServiceDeployer.java:99)
  |         at org.jboss.system.deployers.ServiceDeployer.deploy(ServiceDeployer.java:46)
  |         at org.jboss.deployers.spi.deployer.helpers.AbstractSimpleRealDeployer.internalDeploy(AbstractSimpleRealDeployer.java:62)
  |         at org.jboss.deployers.spi.deployer.helpers.AbstractRealDeployer.deploy(AbstractRealDeployer.java:50)
  |         at org.jboss.deployers.plugins.deployers.DeployerWrapper.deploy(DeployerWrapper.java:171)
  |         at org.jboss.deployers.plugins.deployers.DeployersImpl.doDeploy(DeployersImpl.java:1439)
  |         at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1157)
  |         at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1178)
  |         at org.jboss.deployers.plugins.deployers.DeployersImpl.install(DeployersImpl.java:1098)
  |         at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
  |         at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1631)
  |         at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
  |         at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1082)
  |         at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
  |         at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
  |         at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
  |         at org.jboss.deployers.plugins.deployers.DeployersImpl.process(DeployersImpl.java:781)
  |         at org.jboss.deployers.plugins.main.MainDeployerImpl.process(MainDeployerImpl.java:702)
  |         at org.jboss.system.server.profileservice.repository.MainDeployerAdapter.process(MainDeployerAdapter.java:117)
  |         at org.jboss.system.server.profileservice.repository.ProfileDeployAction.install(ProfileDeployAction.java:70)
  |         at org.jboss.system.server.profileservice.repository.AbstractProfileAction.install(AbstractProfileAction.java:53)
  |         at org.jboss.system.server.profileservice.repository.AbstractProfileService.install(AbstractProfileService.java:361)
  |         at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
  |         at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1631)
  |         at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
  |         at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1082)
  |         at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
  |         at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
  |         at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
  |         at org.jboss.system.server.profileservice.repository.AbstractProfileService.activateProfile(AbstractProfileService.java:306)
  |         at org.jboss.system.server.profileservice.ProfileServiceBootstrap.start(ProfileServiceBootstrap.java:271)
  |         at org.jboss.bootstrap.AbstractServerImpl.start(AbstractServerImpl.java:461)
  |         at org.jboss.Main.boot(Main.java:221)
  |         at org.jboss.Main$1.run(Main.java:556)
  |         at java.lang.Thread.run(Thread.java:595)
  | Caused by: org.jboss.xb.binding.JBossXBException: Failed to create a new SAX parser
  |         at org.jboss.xb.binding.parser.sax.SaxJBossXBParser.<init>(SaxJBossXBParser.java:97)
  |         at org.jboss.xb.binding.UnmarshallerImpl.<init>(UnmarshallerImpl.java:56)
  |         at org.jboss.xb.binding.UnmarshallerFactory$UnmarshallerFactoryImpl.newUnmarshaller(UnmarshallerFactory.java:96)
  |         ... 73 more
  | Caused by: java.lang.ClassCastException: org.apache.xerces.parsers.XIncludeAwareParserConfiguration
  |         at org.apache.xerces.parsers.SAXParser.<init>(SAXParser.java:99)
  |         at org.apache.xerces.parsers.SAXParser.<init>(SAXParser.java:84)
  |         at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.<init>(SAXParserImpl.java:364)
  |         at org.apache.xerces.jaxp.SAXParserImpl.<init>(SAXParserImpl.java:124)
  |         at org.apache.xerces.jaxp.SAXParserFactoryImpl.newSAXParser(SAXParserFactoryImpl.java:76)
  |         at org.jboss.xb.binding.parser.sax.SaxJBossXBParser.<init>(SaxJBossXBParser.java:92)
  |         ... 75 more
  | 
I've traced through the deployer and Xerces code and the Exception is happening for the following reason:
- the deployer sets the context classloader to be the war classloader
- the deployer tries to create a parser to parse context.xml file, this is delegated to xerces
- as part of initializing the parser, xerces does the following:

  | (XMLParserConfiguration)ObjectFactory.createObject(
  | 	"org.apache.xerces.xni.parser.XMLParserConfiguration",
  | 	"org.apache.xerces.parsers.XIncludeAwareParserConfiguration")
  | 
- digging into the createObject() call, xerces uses the context classloader to load XIncludeAwareParserConfiguration
- however, XMLParserConfiguration to which XIncludeAwareParserConfiguration is cast in the above statement is loaded by the current classloader which is the deployer classloader (jboss-web, I believe)
- thus the ClassCastException

Now, I can resolve this issue by following the instructions in  http://www.jboss.org/community/wiki/useJBossWebClassLoaderinJBoss5.  However, neither of the approaches there is acceptable since they both boil down to effectively removing the XercesImpl.jar from my war.  Both of those approaches force the war classloader to delegate to parent first which essentially forces the JBoss bundled XercesImpl.jar to always be used.  In fact, if I follow this approach I get another (application specific) Exception because my application relies on using the context classloader (i.e. the war classloader) to load classes from the XercesImpl.jar inside my war.  Additionally, I don't really want to change the Servlet Spec classloading behaviour anyway.

I think the real problem is that the deployer sets the context classloader to the war classloader before instantiating the parser.  IMHO, I think the deployer should either do this after it instantiates the parser or it should temporarily swap out the context classloader and swap in the deployer classloader in its place.  Incidently, in JBoss 4.0.5, the version from which I'm trying to upgrade to 5.1.0, there is no problem.  I've briefly looked at the 4.0.5 code and I believe that the tomcat deployer used to deploy the war, indeed uses the deployer classloader to instantiate the parser and not the war classloader.

Do I have a point or am I way off?

View the original post : http://www.jboss.org/index.html?module=bb&op=viewtopic&p=4244410#4244410

Reply to the post : http://www.jboss.org/index.html?module=bb&op=posting&mode=reply&p=4244410



More information about the jboss-user mailing list