You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomcat.apache.org by Niels Soeffers <ns...@gmail.com> on 2005/12/05 16:23:30 UTC

Extending webappclassloader

Hello,

I have a problem extending the webappclassLoader.
In the company I work for, we are using eclipse as our IDE. We have multple
projects in eclipse and we would like to have an in-place deployment (so
tomcat works on the (bin) directories of our eclipse projects). That way we
don't have to copy all the modified classes over all the time to a
WEB-INF/classes folder.  I do realize that the WEB-INF/classes is the
correct place to put these classes. And in our continuous integration
environment we are using a war to deploy our application. However to ease
and speed up the development and test process we would like to have Tomcat
to look in our bin directories of eclipse to find our class files.

For this to work I have created an InPlaceDeployWebappClassLoader which
extends of the default WebappClassLoader. However if i add a <Loader> tag to
my server.xml configuration file. I always get the following exception:

SEVERE: Error loading WebappClassLoader
  delegate: false
  repositories:
    /WEB-INF/classes/
----------> Parent Classloader:
sun.misc.Launcher$AppClassLoader@e39a3e
 org.apache.jasper.servlet.JspServlet
java.lang.ClassNotFoundException: org.apache.jasper.servlet.JspServlet
    at org.apache.catalina.loader.WebappClassLoader.loadClass(
WebappClassLoader.java:1338)
    at org.apache.catalina.loader.WebappClassLoader.loadClass (
WebappClassLoader.java:1187)
    at org.apache.catalina.core.StandardWrapper.loadServlet(
StandardWrapper.java:1027)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java
:925)
    at org.apache.catalina.core.StandardContext.loadOnStartup (
StandardContext.java:3880)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java
:4141)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1012)
    at org.apache.catalina.core.StandardHost.start (StandardHost.java:718)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1012)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java
:442)
    at org.apache.catalina.core.StandardService.start (StandardService.java
:450)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java
:680)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:536)
    at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(
NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(
DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke (Method.java:585)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:275)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
5-dec-2005 14:55:24 org.apache.catalina.core.StandardContext loadOnStartup
SEVERE: Servlet /HotDeployOnTomcat threw load() exception
java.lang.ClassNotFoundException: org.apache.jasper.servlet.JspServlet
    at org.apache.catalina.loader.WebappClassLoader.loadClass(
WebappClassLoader.java :1338)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(
WebappClassLoader.java:1187)
    at org.apache.catalina.core.StandardWrapper.loadServlet(
StandardWrapper.java:1027)
    at org.apache.catalina.core.StandardWrapper.load (StandardWrapper.java
:925)
    at org.apache.catalina.core.StandardContext.loadOnStartup(
StandardContext.java:3880)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java
:4141)
    at org.apache.catalina.core.ContainerBase.start (ContainerBase.java
:1012)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:718)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1012)
    at org.apache.catalina.core.StandardEngine.start (StandardEngine.java
:442)
    at org.apache.catalina.core.StandardService.start(StandardService.java
:450)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java
:680)
    at org.apache.catalina.startup.Catalina.start (Catalina.java:536)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(
NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke (
DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:275)
    at org.apache.catalina.startup.Bootstrap.main (Bootstrap.java:413)
5-dec-2005 14:55:24 org.apache.commons.modeler.Registry registerComponent
SEVERE: Null component
Catalina:type=JspMonitor,name=jsp,WebModule=//localhost/HotDeployOnTomcat,J2EEApplication=none,J2EEServer=none

5-dec-2005 14:55:25 org.apache.coyote.http11.Http11BaseProtocol start

Even if I use the loader tag with the default loaderClass
(WebappClassLoader) I get this exception?

Can someone tell me where I have to put the class file of my custom
webappclassloader, currently it is in $CATALINA_HOME/server/classes

Thanks in advance,
Kind Regards,

Re: Extending webappclassloader

Posted by Jon Wingfield <jo...@mkodo.com>.
Our custom loader sits in a jar in $CATALINA_HOME/server/lib
Our classloader uses different parent classloaders depending on which 
version of TC is running.
In 4.1 we just use the parent classloader as supplied in the constructor.
In 5.0.x we use the classloader of WebAppClassLoader as the parent. It's 
a while since the code was written but I seem to recall the creating 
parent is the bootstrap classloader which knows nothing of the server 
classloader, and hence can't find the servlet api classes.
We haven't tried it in 5.5.x yet.

HTH,

Jon

Niels Soeffers wrote:
> Hello,
> 
> I have a problem extending the webappclassLoader.
> In the company I work for, we are using eclipse as our IDE. We have multple
> projects in eclipse and we would like to have an in-place deployment (so
> tomcat works on the (bin) directories of our eclipse projects). That way we
> don't have to copy all the modified classes over all the time to a
> WEB-INF/classes folder.  I do realize that the WEB-INF/classes is the
> correct place to put these classes. And in our continuous integration
> environment we are using a war to deploy our application. However to ease
> and speed up the development and test process we would like to have Tomcat
> to look in our bin directories of eclipse to find our class files.
> 
> For this to work I have created an InPlaceDeployWebappClassLoader which
> extends of the default WebappClassLoader. However if i add a <Loader> tag to
> my server.xml configuration file. I always get the following exception:
> 
> SEVERE: Error loading WebappClassLoader
>   delegate: false
>   repositories:
>     /WEB-INF/classes/
> ----------> Parent Classloader:
> sun.misc.Launcher$AppClassLoader@e39a3e
>  org.apache.jasper.servlet.JspServlet
> java.lang.ClassNotFoundException: org.apache.jasper.servlet.JspServlet
>     at org.apache.catalina.loader.WebappClassLoader.loadClass(
> WebappClassLoader.java:1338)
>     at org.apache.catalina.loader.WebappClassLoader.loadClass (
> WebappClassLoader.java:1187)
>     at org.apache.catalina.core.StandardWrapper.loadServlet(
> StandardWrapper.java:1027)
>     at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java
> :925)
>     at org.apache.catalina.core.StandardContext.loadOnStartup (
> StandardContext.java:3880)
>     at org.apache.catalina.core.StandardContext.start(StandardContext.java
> :4141)
>     at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1012)
>     at org.apache.catalina.core.StandardHost.start (StandardHost.java:718)
>     at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1012)
>     at org.apache.catalina.core.StandardEngine.start(StandardEngine.java
> :442)
>     at org.apache.catalina.core.StandardService.start (StandardService.java
> :450)
>     at org.apache.catalina.core.StandardServer.start(StandardServer.java
> :680)
>     at org.apache.catalina.startup.Catalina.start(Catalina.java:536)
>     at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
>     at sun.reflect.NativeMethodAccessorImpl.invoke(
> NativeMethodAccessorImpl.java:39)
>     at sun.reflect.DelegatingMethodAccessorImpl.invoke(
> DelegatingMethodAccessorImpl.java:25)
>     at java.lang.reflect.Method.invoke (Method.java:585)
>     at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:275)
>     at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
> 5-dec-2005 14:55:24 org.apache.catalina.core.StandardContext loadOnStartup
> SEVERE: Servlet /HotDeployOnTomcat threw load() exception
> java.lang.ClassNotFoundException: org.apache.jasper.servlet.JspServlet
>     at org.apache.catalina.loader.WebappClassLoader.loadClass(
> WebappClassLoader.java :1338)
>     at org.apache.catalina.loader.WebappClassLoader.loadClass(
> WebappClassLoader.java:1187)
>     at org.apache.catalina.core.StandardWrapper.loadServlet(
> StandardWrapper.java:1027)
>     at org.apache.catalina.core.StandardWrapper.load (StandardWrapper.java
> :925)
>     at org.apache.catalina.core.StandardContext.loadOnStartup(
> StandardContext.java:3880)
>     at org.apache.catalina.core.StandardContext.start(StandardContext.java
> :4141)
>     at org.apache.catalina.core.ContainerBase.start (ContainerBase.java
> :1012)
>     at org.apache.catalina.core.StandardHost.start(StandardHost.java:718)
>     at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1012)
>     at org.apache.catalina.core.StandardEngine.start (StandardEngine.java
> :442)
>     at org.apache.catalina.core.StandardService.start(StandardService.java
> :450)
>     at org.apache.catalina.core.StandardServer.start(StandardServer.java
> :680)
>     at org.apache.catalina.startup.Catalina.start (Catalina.java:536)
>     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>     at sun.reflect.NativeMethodAccessorImpl.invoke(
> NativeMethodAccessorImpl.java:39)
>     at sun.reflect.DelegatingMethodAccessorImpl.invoke (
> DelegatingMethodAccessorImpl.java:25)
>     at java.lang.reflect.Method.invoke(Method.java:585)
>     at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:275)
>     at org.apache.catalina.startup.Bootstrap.main (Bootstrap.java:413)
> 5-dec-2005 14:55:24 org.apache.commons.modeler.Registry registerComponent
> SEVERE: Null component
> Catalina:type=JspMonitor,name=jsp,WebModule=//localhost/HotDeployOnTomcat,J2EEApplication=none,J2EEServer=none
> 
> 5-dec-2005 14:55:25 org.apache.coyote.http11.Http11BaseProtocol start
> 
> Even if I use the loader tag with the default loaderClass
> (WebappClassLoader) I get this exception?
> 
> Can someone tell me where I have to put the class file of my custom
> webappclassloader, currently it is in $CATALINA_HOME/server/classes
> 
> Thanks in advance,
> Kind Regards,
> 



---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org