You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomcat.apache.org by "Edward W. Rouse" <er...@comsquared.com> on 2013/07/31 18:40:12 UTC

WebappClassLoader problem

I'm losing my mind here. I finally went full standard to see if the changes
in tomcat 7 would allow me to avoid custom class loaders and contexts, but
ran into a catch-22 issue.

 

I was getting:

 

java.lang.ClassCastException:
com.sun.xml.ws.transport.http.servlet.WSServletContainerInitializer cannot
be cast to javax.servlet.ServletContainerInitializer

                at
org.apache.catalina.startup.ContextConfig.getServletContainerInitializer(Con
textConfig.java:1654)

                at
org.apache.catalina.startup.ContextConfig.processServletContainerInitializer
s(ContextConfig.java:1562)

                at
org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1270)

                at
org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:
878)

                at
org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:
376)

                at
org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSuppor
t.java:119)

                at
org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java
:90)

                at
org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:
5322)

 

So I tracked down where the WSServletContainerInitializer was coming from
and removed the jar file. Now I get:

 

SEVERE: Error configuring application listener of class
org.apache.catalina.deploy.ApplicationListener@1b104d7

java.lang.ClassNotFoundException:
com.sun.xml.ws.transport.http.servlet.WSServletContextListener

                at
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.jav
a:1714)

                at
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.jav
a:1559)

                at
org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceMan
ager.java:527)

                at
org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(Def
aultInstanceManager.java:509)

                at
org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceM
anager.java:137)

                at
org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:
4854)

                at
org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:
5434)

                at
org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)

                at
org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:9
01)

                at
org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)

                at
org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633)

                at
org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1113)

                at
org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1
671)

                at
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)

                at
java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)

                at java.util.concurrent.FutureTask.run(FutureTask.java:138)

                at
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.ja
va:886)

                at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:9
08)

                at java.lang.Thread.run(Thread.java:662)

 

and what's in the context is:

 

<?xml version="1.0" encoding="UTF-8"?>

      <Context path="/idwm" docBase="${catalina.home}/webapps/idwm" >

            <Resources
className="org.apache.naming.resources.VirtualDirContext"

                  extraResourcePaths="/idwm/*/=/usr/us/idwm/plugins/*/"/>

 

            <Loader
className="org.apache.catalina.loader.VirtualWebappLoader"

                  virtualClasspath="/usr/us/idwm/plugins/*/WEB-INF/classes;

                  /usr/us/idwm/plugins/*/WEB-INF/lib/*.jar;

                  /usr/us/idwm/plugins/*/;"

            />

      </Context>

 

 

So now what? I'm using the classes provided by apache and I'm damned if I do
and damned if I don't. Is there even a solution to this?


Re: WebappClassLoader problem

Posted by Nick Williams <ni...@nicholaswilliams.net>.
On Jul 31, 2013, at 11:40 AM, Edward W. Rouse wrote:

> I'm losing my mind here. I finally went full standard to see if the changes
> in tomcat 7 would allow me to avoid custom class loaders and contexts, but
> ran into a catch-22 issue.
> 
> 
> 
> I was getting:
> 
> 
> 
> java.lang.ClassCastException:
> com.sun.xml.ws.transport.http.servlet.WSServletContainerInitializer cannot
> be cast to javax.servlet.ServletContainerInitializer
> 
>                at
> org.apache.catalina.startup.ContextConfig.getServletContainerInitializer(Con
> textConfig.java:1654)
> 
>                at
> org.apache.catalina.startup.ContextConfig.processServletContainerInitializer
> s(ContextConfig.java:1562)
> 
>                at
> org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1270)
> 
>                at
> org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:
> 878)
> 
>                at
> org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:
> 376)
> 
>                at
> org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSuppor
> t.java:119)
> 
>                at
> org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java
> :90)
> 
>                at
> org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:
> 5322)
> 
> 
> 
> So I tracked down where the WSServletContainerInitializer was coming from
> and removed the jar file. Now I get:
> 
> 
> 
> SEVERE: Error configuring application listener of class
> org.apache.catalina.deploy.ApplicationListener@1b104d7
> 
> java.lang.ClassNotFoundException:
> com.sun.xml.ws.transport.http.servlet.WSServletContextListener
> 
>                at
> org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.jav
> a:1714)
> 
>                at
> org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.jav
> a:1559)
> 
>                at
> org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceMan
> ager.java:527)
> 
>                at
> org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(Def
> aultInstanceManager.java:509)
> 
>                at
> org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceM
> anager.java:137)
> 
>                at
> org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:
> 4854)
> 
>                at
> org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:
> 5434)
> 
>                at
> org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
> 
>                at
> org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:9
> 01)
> 
>                at
> org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
> 
>                at
> org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633)
> 
>                at
> org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1113)
> 
>                at
> org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1
> 671)
> 
>                at
> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
> 
>                at
> java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
> 
>                at java.util.concurrent.FutureTask.run(FutureTask.java:138)
> 
>                at
> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.ja
> va:886)
> 
>                at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:9
> 08)
> 
>                at java.lang.Thread.run(Thread.java:662)
> 
> 
> 
> and what's in the context is:
> 
> 
> 
> <?xml version="1.0" encoding="UTF-8"?>
> 
>      <Context path="/idwm" docBase="${catalina.home}/webapps/idwm" >
> 
>            <Resources
> className="org.apache.naming.resources.VirtualDirContext"
> 
>                  extraResourcePaths="/idwm/*/=/usr/us/idwm/plugins/*/"/>
> 
> 
> 
>            <Loader
> className="org.apache.catalina.loader.VirtualWebappLoader"
> 
>                  virtualClasspath="/usr/us/idwm/plugins/*/WEB-INF/classes;
> 
>                  /usr/us/idwm/plugins/*/WEB-INF/lib/*.jar;
> 
>                  /usr/us/idwm/plugins/*/;"
> 
>            />
> 
>      </Context>
> 
> 
> 
> 
> 
> So now what? I'm using the classes provided by apache and I'm damned if I do
> and damned if I don't. Is there even a solution to this?

I've seen that before, with Persistence on GlassFish. Turned out I had the Persistence API JARs in /WEB-INF/lib in my web application. Since two identical classes loaded by two different class loaders are actually different classes, the cast failed.

My bet is you have the javax.websocket JAR(s) in /WEB-INF/lib in your web application. You can compile against these JARs, but they MUST NOT be in /WEB-INF/lib.

Nick
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org