Hi All!
Briefly: it seems to me that the standard implementation of Loader loads class
of web application class loader in a too contrained way. Here follow the
details.
I have a task to extend the standard implementation of web app class loader in
a certain way. The main condition is that my class loader implementation
(MyWebappClassLoader) must reside among my application's classes, because it
references many of them. The standard implementation of Loader (WebappLoader)
which is responsible for loading of web app class loader's class, contains the
following lines of code (Tomcat 6.0.18 source code):
// WebappLoader.java:
private WebappClassLoader createClassLoader()
throws Exception {
Class clazz = Class.forName(loaderClass);
.............
My extension of WebappLoader (MyWebappLoader) also resides in my application's
classes. I can load it successfully with the help of another WebappClassLoader
in some tricky way. With the above mentioned approach, I was expecting that
MyWebappClassLoader will be successfully loaded as well, however it is not (I
get ClassNotFoundException from Class.forName() call).
Finally I figured out that Class.forName() uses for loading the defining class
loader of the _current_ class, and the current class for that code is
superclass WebappLoader but not MyWebappLoader itself. WebappLoader is loaded
by StandardClassLoader, but not by the application-aware class loader
WebappClassLoader which loads MyWebappLoader. So MyWebappClassLoader of course
cannot be found by StandardClassLoader. I believe that a single correction like
this would make me happy:
Class clazz = Class.forName(loaderClass, true,
this.getClass().getClassLoader());
because this.getClass().getClassLoader() would produce class loader used to
load MyWebappLoader (i.e. that would be an instance of WebappClassLoader, but
not StandardClassLoader).
So, is not it an unnecessary limitation to WebappLoader? And is this something
that could be fixed in future? I will appreciate any comments on that!
Regards,
Pavel
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]