I'm having an issue with Tomcat 8.0.12 when undeploying contexts.  I have
autoDeploy turned off, and am pushing WARs+context.xmls through the Tomcat
manager's deploy command.

I have several ServletContextListeners that handle proper context
shutdown.  The ones that cause the issue look like this:

@Override
public synchronized void contextInitialized( ServletContextEvent event ) {
if( enabled ) {
MyClass.initialize();
}
}

@Override
public synchronized void contextDestroyed( ServletContextEvent event ) {
MyClass.release();
}

If the 'enabled' flag is not set, and MyClass was not loaded anywhere else
in the app, the webapp ClassLoader tries to load the class while the
context is shutting down.  It throws this exception:
 java.lang.NoClassDefFoundError: some/package/MyClass
        at
some.package.MyListener.contextDestroyed(SingletonCleaner.java:na)
        at
org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:4792)
        at
org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5392)
        at
org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232)
        at
org.apache.catalina.core.StandardContext.reload(StandardContext.java:3768)
        at
org.apache.catalina.startup.HostConfig.reload(HostConfig.java:1306)
        at
org.apache.catalina.startup.HostConfig.checkResources(HostConfig.java:1238)
        at
org.apache.catalina.startup.HostConfig.check(HostConfig.java:1493)
        at sun.reflect.GeneratedMethodAccessor574.invoke(Unknown Source)
        at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:483)
        at
org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300)
        at
com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
--
Caused by: java.lang.ClassNotFoundException: some.package.MyClass
        at
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1320)
        at
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1173)
        ... 45 more

I set WebappClassLoader logging levels to FINE, and got this output:
21-Mar-2015 14:59:46.493 FINE [localhost-startStop-1]
org.apache.catalina.loader.WebappClassLoader.loadClass
loadClass(some.package.MyClass, false)
21-Mar-2015 14:59:46.493 FINE [localhost-startStop-1]
org.apache.catalina.loader.WebappClassLoader.findClass
findClass(some.package.MyClass)

Any ideas why the class loader is throwing the errors?

Reply via email to