For those that may be interested...
I was unclear as to how Tomcat was resolving class
loading and the visibility of classes to a context's
classloader so I created a simlpe test suite.
The test results are attached.
Rob Shaw
Servidium Inc.
Title: Tomcat Test Results
Class Loading Tests
Setup:
- A servlet was created that tries to load a class in Package A and a class
in Package B via Class.forName().
- If either class was found, the class was instantiated via newInstance().
- Within the constructor of the class in Package A, an attempt to load a
class in Package B is made via Class.forName().
- Within the constructor of the class in Package B, an attempt to load a
class in Package A is made via Class.forName().
Test Scenarios
|
Results |
# |
Servlet in webapp's classes directory |
Servlet in system classpath |
Package A in webapp's classes or lib directory
|
Package A in system classpath |
Package B in webapp's classes or lib directory |
Package B in system classpath |
Servlet loaded |
Package A found |
Package A able to load package B |
Package B found |
Package B able to load package A |
1 |
X
|
.
|
X
|
.
|
X
|
.
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
2 |
X
|
.
|
X
|
.
|
.
|
X
|
Yes
|
Yes
|
Yes
|
Yes
|
No
|
3 |
X
|
.
|
.
|
X
|
X
|
.
|
Yes
|
Yes
|
No
|
Yes
|
Yes
|
4 |
X
|
.
|
.
|
X
|
.
|
X
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
5 |
.
|
X
|
X
|
.
|
X
|
.
|
Yes
|
No
|
N/A
|
No
|
N/A
|
6 |
.
|
X
|
X
|
.
|
.
|
X
|
Yes
|
No
|
N/A
|
Yes
|
No
|
7 |
.
|
X
|
.
|
X
|
X
|
.
|
Yes
|
Yes
|
No
|
No
|
N/A
|
8 |
.
|
X
|
.
|
X
|
.
|
X
|
Yes
|
Yes
|
Yes
|
Yes
|
Yes
|
Conclusions:
- Only scenarios 1, 4, and 8 produced no errors.
- Scenario 1 says treat an application as an independent unit and place everything
that it needs in it's webapps classes or lib directory.
- Scenario 4 says place only the servlet in the webapps classes directory
and have the rest of the supporting classes and JARs outside accessible via
the system classpath.
- Scenario 8 says place everything in a location that is accessible via the
system classpath.
|