Java Mailing List Archive

http://www.junlu.com/

Home » Home (12/2007) » Apache Tomcat »

Re: Extending WebappLoader doesn't load internal tomcat libs

Joaquín López

2006-11-30


>
> I would like to extend WebappLoader to use libraries that are placed out
> of my webapp dir, but when I try to start the server, I obtain the following
> error:
>
> Nov 30, 2006 11:38:07 AM es.tid.psstlatam.tomcat.CustomWebappLoader start
> INFO: CustomWebappLoader start:
> /etc/opt/psbatlatam/ar/pmg/pod/;/opt/install/psbatlatam/apache-
> tomcat-5.5.20/common/lib/servlet-api.
> jar
> Nov 30, 2006 11:38:07 AM es.tid.psstlatam.tomcat.CustomWebappLoader start
> INFO: CustomWebappLoader start -> dir fileName:
> /etc/opt/psbatlatam/ar/pmg/pod/
> Nov 30, 2006 11:38:07 AM es.tid.psstlatam.tomcat.CustomWebappLoader start
> INFO: CustomWebappLoader start -> dir fileName:
> /opt/install/psbatlatam/apache-tomcat-5.5.20/common/lib/servlet-api.jar
> Nov 30, 2006 11:38:08 AM org.apache.catalina.startup.ContextConfig start
> FINE: ContextConfig: Processing START
> Nov 30, 2006 11:38:08 AM org.apache.catalina.startup.ContextConfigprocessDefaultWebConfig
> FINE: Processing context [/pod] web configuration resource
> file:///opt/install/psbatlatam/apache-tomcat-5.5.20/conf/web.xml
> Nov 30, 2006 11:38:11 AM org.apache.catalina.startup.ContextConfigdefaultWebConfig
> FINE: Processed default web.xml /opt/install/psbatlatam/apache-
> tomcat-5.5.20/conf/web.xml 2805
> Nov 30, 2006 11:38:11 AM org.apache.catalina.startup.ContextConfigapplicationWebConfig
> FINE: Parsing application web.xml file at
> jndi:/localhost/pod/WEB-INF/web.xml
> Nov 30, 2006 11:38:11 AM org.apache.catalina.startup.ContextConfig start
> FINE: Pipeline Configuration:
> Nov 30, 2006 11:38:11 AM org.apache.catalina.startup.ContextConfig start
> FINE:  org.apache.catalina.core.StandardContextValve/1.0
> Nov 30, 2006 11:38:11 AM org.apache.catalina.startup.ContextConfig start
> FINE: ======================
> java.lang.reflect.InvocationTargetException
>      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>      at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
>      at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
>      at java.lang.reflect.Method.invoke(Unknown Source)
>      at org.apache.catalina.startup.Bootstrap.start (Bootstrap.java:294)
>      at org.apache.catalina.startup.Bootstrap.main (Bootstrap.java:432)
> Caused by: java.lang.NoClassDefFoundError: javax/servlet/http/HttpServlet
>      at java.lang.ClassLoader.defineClass1(Native Method)
>      at java.lang.ClassLoader.defineClass(Unknown Source)
>      at java.security.SecureClassLoader.defineClass(Unknown Source)
>      at org.apache.catalina.loader.WebappClassLoader.findClassInternal(
> WebappClassLoader.java:1815)
>      at org.apache.catalina.loader.WebappClassLoader.findClass(
> WebappClassLoader.java:869)
>      at org.apache.catalina.loader.WebappClassLoader.loadClass(
> WebappClassLoader.java:1322)
>      at org.apache.catalina.loader.WebappClassLoader.loadClass(
> WebappClassLoader.java:1201)
>      at org.apache.catalina.core.StandardWrapper.loadServlet(
> StandardWrapper.java:1034)
>      at org.apache.catalina.core.StandardWrapper.load (
> StandardWrapper.java:932)
>      at org.apache.catalina.core.StandardContext.loadOnStartup(
> StandardContext.java:3951)
>      at org.apache.catalina.core.StandardContext.start(
> StandardContext.java:4225)
>      at org.apache.catalina.core.ContainerBase.start(ContainerBase.java
> :1013)
>      at org.apache.catalina.core.StandardHost.start(StandardHost.java
> :718)
>      at org.apache.catalina.core.ContainerBase.start (ContainerBase.java:1013)
>      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:709)
>      at org.apache.catalina.startup.Catalina.start (Catalina.java:551)
>      ... 6 more
>
>
> Tomcat don't find HttpServlet.class, but It seems that my
> CustomWebappLoader add this jar (/opt/install/psbatlatam/apache-
> tomcat-5.5.20/common/lib/servlet-api.jar) to the repository. I have
> implemented a CustomWebappLoader as follow:
>
> public class CustomWebappLoader extends WebappLoader {
>
>
>   private String classPath;
>   protected static Log log = LogFactory.getLog( CustomWebappLoader.class);
>
>
>   public String getClassPath() {
>      return classPath;
>   }
>
>   // Called by tomcat to set the property
>   public void setClassPath(String cp) {
>      classPath=cp;
>   }
>
>   public CustomWebappLoader() {
>      super();
>      log.info("CustomWebappLoader constructor");
>   }
>
>   /*public void init() {
>      super.init();
>   }*/
>
>   public CustomWebappLoader(ClassLoader parent) {
>      super(parent);
>      log.info("CustomWebappLoader constructor parent: " +
> parent.getClass().getName());
>   }
>
>   public void addRepository(String repository) {
>      log.debug ("[CL] AddRepository called with argument:
> "+repository);
>   }
>
>   public void start() throws LifecycleException {
>
>      log.info("CustomWebappLoader start: " + classPath);
>      if(classPath==null || classPath.length()==0) return;
>
>      String [] classPathItems=classPath.split(";");
>      for(int i=0; i<classPathItems.length; i++) {
>         // Check if the item specifies a set of jar files
>         String classPathItem=classPathItems[i];
>         int index=classPathItem.indexOf("/*.jar");
>         if(index!=-1) {
>           String jarDir=classPathItem.substring(0, index+1);
>           log.debug("[CCL] jardir: "+jarDir);
>           File dir=new File(jarDir);
>           File[] jars=dir.listFiles();
>           for(int j=0; j<jars.length; j++) {
>              String jarFileName=jars[j].getName();
>              if(jarFileName.endsWith(".jar")) {
>                 log.info("CustomWebappLoader start -> jar
> fileName: " + jarFileName);
>                 super.addRepository ("file:/"+jarDir+jarFileName);
>              }
>           }
>         } else {
>           log.info("CustomWebappLoader start -> dir fileName: " +
> classPathItem);
>           super.addRepository("file:/"+classPathItem);
>         }
>      }
>
>      super.start();
>   }
> }
>
> In the server.xml I have added:
>
> <Context path="/pod"
> docBase="/opt/psbatlatam/ar/Radius_disconnection_web/" debug="0"
> privileged="true" reloadable="true">
>
>          <!-- classPath contains semicolon separated list of
> directories containing
>          classes or path/*.jar for getting all the jars in the
> specified path -->
>
>          <Loader className="
> es.tid.psstlatam.tomcat.CustomWebappLoader" delegate="false"
> classPath="/etc/opt/psbatlatam/ar/pmg/
> pod/;/opt/install/psbatlatam/apache-tomcat-5.5.20/common/lib/servlet-
> api.jar"/>
>
> </Context>
>
> Can anyone help me, please??
> Thanks, Joaquin
>
©2008 junlu.com - Jax Systems, LLC, U.S.A.