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: [EMAIL PROTECTED] 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
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: [EMAIL PROTECTED] 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