I'm trying to upgrade a Tomcat (development) server from 5.0.16 to 5.0.25
and have found some classloader frustrations. Ultimately, I'd like to have
the webapp JAR file under its webapp/WEB-INF/lib directory and a set of
shared classes (in several JARs) residing in the $CATALINA_BASE/shared/lib
directory (to be shared among several web apps). Everything else being
equal between the 5.0.16 and 5.0.25 environments, listed below are JAR
placements that work and those that throw exceptions:
Key:
"wa" = webapp;
"$CB" = $CATALINA_BASE
": : :" = stack trace continues
"com.squirrelydo.core." = package prefix indicating a shared class
"com.squirrelydo.lnal." = package prefix indicating a webapp class
version webapp classes shared classes
result
====== =========== ============= ==========
5.0.16 wa/WEB-INF/lib wa/WEB-INF/lib works
fine
----------------------------------------------------------------
5.0.16 wa/WEB-INF/lib $CB/shared/lib
java.lang.ClassNotFoundException: com.squirrelydo.lnal.LNAL$Session
at
org.apache.catalina.loader.StandardClassLoader.loadClass(StandardClassLoader
.java:891)
at
org.apache.catalina.loader.StandardClassLoader.loadClass(StandardClassLoader
.java:756)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at com.squirrelydo.core.util.ClassAsEnum.<init>(ClassAsEnum.java:35)
at com.squirrelydo.core.prefs.Property.<init>(Property.java:45)
at com.squirrelydo.lnal.LNAL.<init>(LNAL.java:30)
at com.squirrelydo.lnal.LNAL$Session.<clinit>(LNAL.java:43)
: : :
The class initialization for LNAL$Session triggers the constructor for a
super class (ClassAsEnum) that spans the divide between webapp and
shared classloaders. The ClassAsEnum super class can't "see" LNAL$Session.
----------------------------------------------------------------
5.0.16 $CB/shared/lib $CB/shared/lib
works fine
----------------------------------------------------------------
5.0.25 wa/WEB-INF/lib wa/WEB-INF/lib works
fine
----------------------------------------------------------------
5.0.25 wa/WEB-INF/lib $CB/shared/lib
java.lang.NoClassDefFoundError: com/squirrelydo/core/servlet/TMLServlet
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at
org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLo
ader.java:1634)
at
org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.jav
a:860)
at
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.jav
a:1307)
at
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.jav
a:1189)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at
org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLo
ader.java:1634)
at
org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.jav
a:860)
at
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.jav
a:1307)
at
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.jav
a:1189)
at
org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:95
4)
: : :
A webapp class's (I'm not sure exactly which) constructor is attempting to
find the (shared) super class TMLServlet.
----------------------------------------------------------------
5.0.25 $CB/shared/lib $CB/shared/lib
java.lang.ClassNotFoundException: com.squirrelydo.lnal.Calendar
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.jav
a:1340)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.jav
a:1189)
: : :
>From the Tomcat log:
----------------------------------------------------------------------------
---------------
2004-07-04 13:16:10 StandardContext[/LNAL]Marking servlet Calendar as
unavailable
2004-07-04 13:16:10 StandardContext[/LNAL]Error loading WebappClassLoader
delegate: false
repositories:
/WEB-INF/classes/
----------> Parent Classloader:
StandardClassLoader
delegate: true
repositories:
----------> Parent Classloader:
StandardClassLoader
delegate: true
repositories:
file:D:\zVAR\tomcat\5.0.25\common\classes\
file:D:\zVAR\tomcat\5.0.25\common\endorsed\xercesImpl.jar
file:D:\zVAR\tomcat\5.0.25\common\endorsed\xmlParserAPIs.jar
file:D:\zVAR\tomcat\5.0.25\common\lib\ant.jar
file:D:\zVAR\tomcat\5.0.25\common\lib\commons-collections.jar
file:D:\zVAR\tomcat\5.0.25\common\lib\commons-dbcp-1.1.jar
file:D:\zVAR\tomcat\5.0.25\common\lib\commons-el.jar
file:D:\zVAR\tomcat\5.0.25\common\lib\commons-pool-1.1.jar
file:D:\zVAR\tomcat\5.0.25\common\lib\jasper-compiler.jar
file:D:\zVAR\tomcat\5.0.25\common\lib\jasper-runtime.jar
file:D:\zVAR\tomcat\5.0.25\common\lib\jsp-api.jar
file:D:\zVAR\tomcat\5.0.25\common\lib\naming-common.jar
file:D:\zVAR\tomcat\5.0.25\common\lib\naming-factory.jar
file:D:\zVAR\tomcat\5.0.25\common\lib\naming-java.jar
file:D:\zVAR\tomcat\5.0.25\common\lib\naming-resources.jar
file:D:\zVAR\tomcat\5.0.25\common\lib\phpsrvlt.jar
file:D:\zVAR\tomcat\5.0.25\common\lib\servlet-api.jar
----------> Parent Classloader:
[EMAIL PROTECTED]
----------------------------------------------------------------------------
---------------
In this last case, the Tomcat classloader hierarchy doesn't seem to
recognize the presence of any JAR files in $CATALINA_BASE/shared/lib.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]