I found a little time to increase my "expertise" on classloaders.
I created a little test jsp to see what types of ClassLoaders (CL)
are returned from the Thread.currentThread.contextClassLoader()
as well as the CLs that are used to load up classes in servlets/jsps.
These are the results (I was going to include some non-Tomcat servers,
but did not get a chance).
ServletContainer ContextClassLoader returns
--------------------------------------------------
Tomcat
3.1.1 web-app CL
3.2.3 system CL
3.3-b1 "dependency-wrapped" system CL (?)
4.0-b6 web-app CL
What I'm seeing is that the contextClassLoader() method basically
returns a "system" ClassLoader for Tomcat 3.2.3 and 3.3-b1, whereas
3.1.1 and 4.0-b6 return web-app CL. So it does not look like
one can safely rely on "contextClassLoader()" for getting the
"context" CL for applications deployed in a server environment.
Are these results what you would expect?
- Gidado
p.s. Here are the actual results (the first classname is the
CL being used, and the subsequent classnames are the parents):
Tomcat 3.1.1:
----------------------------
CONTEXT CLASSLOADER:
org.apache.tomcat.loader.AdaptiveClassLoader@8df60
sun.misc.Launcher$AppClassLoader@71732b (parent)
sun.misc.Launcher$ExtClassLoader@7fdcde (parent)
CLASSLOADER:
org.apache.tomcat.loader.AdaptiveClassLoader@8df60
sun.misc.Launcher$AppClassLoader@71732b
sun.misc.Launcher$ExtClassLoader@7fdcde
Tomcat 3.2.3:
----------------------------
CONTEXT CLASSLOADER:
sun.misc.Launcher$AppClassLoader@404536
sun.misc.Launcher$ExtClassLoader@7d8483
CLASSLOADER:
AdaptiveClassLoader( )
sun.misc.Launcher$AppClassLoader@404536
sun.misc.Launcher$ExtClassLoader@7d8483
Tomcat 3.3 Beta 1:
----------------------------
CONTEXT CLASSLOADER:
org.apache.tomcat.util.depend.DependClassLoader@71f189
sun.misc.Launcher$AppClassLoader@71732b
sun.misc.Launcher$ExtClassLoader@7fdcde
CLASSLOADER:
java.net.FactoryURLClassLoader@147496
java.net.FactoryURLClassLoader@724a9d
java.net.FactoryURLClassLoader@e3e60
sun.misc.Launcher$AppClassLoader@71732b
sun.misc.Launcher$ExtClassLoader@7fdcde
Tomcat 4.0 Beta 6:
----------------------------
CONTEXT CLASSLOADER & CLASSLOADER:
WebappClassLoader
available:
delegate: false
repositories:
/WEB-INF/classes/
required:
----------> Parent Classloader:
StandardClassLoader
available:
delegate: false
repositories:
file:D:\jakarta\jakarta-tomcat-4.0-b6\lib\jasper-runtime.jar
file:D:\jakarta\jakarta-tomcat-4.0-b6\lib\namingfactory.jar
required:
----------> Parent Classloader:
StandardClassLoader
available:
delegate: false
repositories:
file:D:\jakarta\jakarta-tomcat-4.0-b6\common\lib\naming.jar
file:D:\jakarta\jakarta-tomcat-4.0-b6\common\lib\resources.jar
file:D:\jakarta\jakarta-tomcat-4.0-b6\common\lib\servlet.jar
required:
----------> Parent Classloader:
sun.misc.Launcher$AppClassLoader@71732b
sun.misc.Launcher$ExtClassLoader@7fdcde