Hello. If the docs are correct, then why are my JAR files in $CATALINA_HOME/shared/lib not being loaded? The utility class in the JAR file was loaded just fine when I placed the JAR in $CATALINA_HOME/common/lib, but the docs say this is not the right place to put it.
I need to share a few utility classes and a JDBC driver across all apps and would rather keep them in 1 place. This looks like a bug. I am using Tomcat 4.1.18 and am going to try 4.1.24 to see if that helps. Has anyone else seen this behavior? Thanks. -----Original Message----- From: "Shapira, Yoav"<[EMAIL PROTECTED]> To: "Tomcat Users List"<[EMAIL PROTECTED]> Date: Mon Mar 31 08:53:39 PST 2003 Subject: Re: shared resources > >Howdy, >I believe the documentation is correct. > >If you've searched this list's archives for topics like this one, you'll >find they come up all the time ;(. I usually chime in with the >following: > >What do you gain from sharing a jar across webapps? With some notable >exceptions, e.g. a JDBC driver you want pooled using a pool defined in >server.xml, you don't gain much from sharing a jar. Your deployment >becomes more complicated, and you can't use a true war file approach. >Disk space is cheap. My philosophy is to not share jars in locations >like common/lib or shared/lib unless absolutely necessary. Yes, this >does force you to pay extra attention to what versions of jars are >deployed along with your webapps, but this is something you have to pay >attention to anyways. > >Yoav Shapira >Millennium ChemInformatics > > >>-----Original Message----- >>From: Pat McGroin [mailto:[EMAIL PROTECTED] >>Sent: Monday, March 31, 2003 11:10 AM >>To: Tomcat Users List >>Cc: Paul Hsu >>Subject: Re: Re: shared resources >> >>Paul, >> >>That worked *BUT* the documentation says otherwise: >>http://jakarta.apache.org/tomcat/tomcat-4.1-doc/class-loader-howto.html >> >>"For classes and resources that must be shared across all web >applications, >>place unpacked classes and resources under >$CATALINA_HOME/shared/classes, >>or place JAR files containing those classes and resources under >>$CATALINA_HOME/shared/lib." >> >>"This class loader contains additional classes that are made visible to >>both Tomcat internal classes and to all web applications. Normally, >>application classes should NOT be placed here." >> >>The $CATALINA_HOME/common/lib contains such JAR files as ant.jar and >>servlet.jar so it does not seem like the place for my shared JAR files. >> >>Is the documentation wrong or is this a bug? >>Or am I just reading the documentation incorrectly? >> >>Thanks, >>Todd >> >> >>-----Original Message----- >>From: "Paul Hsu"<[EMAIL PROTECTED]> >>To: "Tomcat Users List"<[EMAIL PROTECTED]> >>Date: Sun Mar 30 19:20:44 PST 2003 >>Subject: Re: shared resources >> >>>Todd, >>> >>>You need to put your jar file under $CATALINA_HOME/common direcotry. >>>$CATALINA_HOME/shared directory are only available to Catalina engine, >not >>>application but /common can be seen by both engine and application. >>> >>>Paul >>>----- Original Message ----- >>>From: "Pat McGroin" <[EMAIL PROTECTED]> >>>To: <[EMAIL PROTECTED]> >>>Sent: Sunday, March 30, 2003 5:32 PM >>>Subject: Re: shared resources >>> >>> >>>> Craig, >>>> >>>> Thanks again for the information. >>>> The info. you've supplied has been very useful. >>>> However, my problem remains: >>>> >>>> I cannot access the class that resides in a JAR file (utilities.jar) >in >>><tomcat_home>/shared/lib and get a java.lang.NoClassDefFoundError >>>> >>>> I am spinning my wheels on this so hopefully some details will shed >some >>>light on my problem. I wrote a very simple servlet that attempts to >use >>the >>>class in the shared dir. >>>> >>>> ---- >>>> import com.myco.utilities.CASDate; >>>> import javax.servlet.http.HttpServlet; >>>> import javax.servlet.http.HttpServletRequest; >>>> import javax.servlet.http.HttpServletResponse; >>>> >>>> public class Test1 extends HttpServlet { >>>> // >>>> public void doGet(HttpServletRequest request, HttpServletResponse >>>response) throws javax.servlet.ServletException, java.io.IOException { >>>> >>>> System.out.println("GET method of Test1 invloked"); >>>> performTask(request, response); >>>> } >>>> // >>>> public void doPost(HttpServletRequest request, HttpServletResponse >>>response) throws javax.servlet.ServletException, java.io.IOException { >>>> >>>> System.out.println("POST method of Test1 invloked"); >>>> performTask(request, response); >>>> } >>>> /** >>>> * Test the use of a shared class. >>>> */ >>>> public void performTask(HttpServletRequest request, >HttpServletResponse >>>response) { >>>> >>>> try { >>>> java.io.PrintWriter pw = response.getWriter(); >>>> CASDate today = new CASDate(); >>>> pw.println("CASDate today is " + today.toString()); >>>> pw.println("CASDate class loaded..."); >>>> } >>>> catch(Throwable theException) { >>>> System.out.println("Error..."); >>>> theException.printStackTrace(System.out); >>>> } >>>> } >>>> } >>>> ---- >>>> This is the utility class (some getXXX methods deleted for brevity): >>>> ---- >>>> package com.myco.utilities; >>>> >>>> import java.util.Calendar; >>>> import java.util.GregorianCalendar; >>>> >>>> public class CASDate { >>>> private int ccc = 0; >>>> private int yyy = 0; >>>> private int mmm = 0; >>>> private int ddd = 0; >>>> private int time = 0; >>>> /** >>>> * Default constructor is to create CAS date using the current date. >>>> */ >>>> public CASDate() { >>>> super(); >>>> GregorianCalendar cal = new GregorianCalendar(); >>>> ccc = 20; >>>> yyy = cal.get(Calendar.YEAR) - 2000; >>>> mmm = cal.get(Calendar.MONTH) + 1; >>>> ddd = cal.get(Calendar.DAY_OF_MONTH); >>>> } >>>> /** >>>> * Return a string in MM/DD/CCYY format. >>>> */ >>>> public String toString() { >>>> String returnValue = getMonth() + "/" + getDay() + "/" + >>>getYearAndCentury(); >>>> return returnValue; >>>> } >>>> } >>>> ---- >>>> >>>> The error I get is: >>>> java.lang.NoClassDefFoundError: com/myco/utilities/CASDate >>>> >>>> When I moved utilities.jar to <webapp>/WEB-INF/lib the error goes >away. >>>> I hope this provides some clues as to what is going wrong. At this >point >>>it looks like a bug but I hope I'm wrong. I am using Tomcat 4.1.18. >>>> >>>> Any help is GREATLY appreciated. >>>> >>>> Thanks, >>>> Todd >>>> >>>> >>>> -----Original Message----- >>>> From: "Craig R. McClanahan"<[EMAIL PROTECTED]> >>>> To: "Pat McGroin"<[EMAIL PROTECTED]> >>>> Date: Thu Mar 27 13:53:24 PST 2003 >>>> Subject: Re: shared resources >>>> >>>> > >>>> > >>>> >On Thu, 27 Mar 2003, Pat McGroin wrote: >>>> > >>>> >> Date: Thu, 27 Mar 2003 12:57:03 -0800 (PST) >>>> >> From: Pat McGroin <[EMAIL PROTECTED]> >>>> >> To: Craig R. McClanahan <[EMAIL PROTECTED]> >>>> >> Subject: Re: Re: shared resources >>>> >> >>>> >> Craig, >>>> >> >>>> >> Thanks very much for the detailed reply. >>>> >> That is very useful information for getting at resource files. >>>> >> However, my problem is much simpler. I am simply getting >>>java.lang.NoClassDefFoundError errors when I try to use classes in JAR >>files >>>in the <tomcat_home>/shared/lib directory. >>>> >> When I move the jar files to my <webapp root>/WEB-INF/lib the >classes >>>are loaded just fine and I don't see these errors. >>>> >> >>>> > >>>> >One likely cause for this sort of thing: if a class in your >"problem >>>> >child" JAR file is itself loaded from the shared class loader, but >>tries >>>> >to access a different class that is in the webapp class loader, >you'll >>>get >>>> >exactly this sort of problem. >>>> > >>>> >Note that NoClassDefFound errors do *not* say that the class named >in >>the >>>> >exception report cannot be found (that would be a >>>ClassNotFoundException). >>>> >Instead, it means that one of the classes that this class depends >on >>>> >cannot be found. >>>> > >>>> >> Thanks, >>>> >> Todd >>>> > >>>> >Craig >>>> > >>>> >> >>>> >> >>>> >> -----Original Message----- >>>> >> From: "Craig R. McClanahan"<[EMAIL PROTECTED]> >>>> >> To: "Tomcat Users List"<[EMAIL PROTECTED]> >>>> >> Date: Thu Mar 27 12:33:57 PST 2003 >>>> >> Subject: Re: shared resources >>>> >> >>>> >> > >>>> >> > >>>> >> >On Thu, 27 Mar 2003, Pat McGroin wrote: >>>> >> > >>>> >> >> Date: Thu, 27 Mar 2003 11:20:49 -0800 (PST) >>>> >> >> From: Pat McGroin <[EMAIL PROTECTED]> >>>> >> >> Reply-To: Tomcat Users List <[EMAIL PROTECTED]> >>>> >> >> To: [EMAIL PROTECTED] >>>> >> >> Subject: shared resources >>>> >> >> >>>> >> >> Hello. >>>> >> >> >>>> >> >> I am trying to reference a few JAR files from an >out-of-process >>>Tomcat >>>> >> >> 4.1.18 application. >>>> >> >> >>>> >> >> The Tomcat 4.1 documentation says that unpacked shared classes >and >>>> >> >> resources will be loaded out of the ><tomcat_root>/shared/classes >>>> >> >> directory and packed shared resources are loaded out of >>>> >> >> <tomcat_root>/shared/lib: >>>> >> >> >>>> >> >> >>>http://jakarta.apache.org/tomcat/tomcat-4.1-doc/class-loader-howto.htm >l >>>> >> >> >>>> >> >> I put a few JAR files in <tomcat_root>/shared/lib but they are >>never >>>> >> >> loaded. I can move them into my <webapp root>/WEB-INF/lib and >they >>>are >>>> >> >> loaded without problems. >>>> >> >> >>>> >> >> Am I misunderstanding how resources are found in Tomcat 4.1? >The >>>> >> >> context I am using is not within <tomcat_home>/webapps. It is >in >>an >>>> >> >> entirely diferent directory. Could that be the problem? >>>> >> >> >>>> >> >> I posted a simliar question a few days ago but was not yet >>properly >>>> >> >> subscribed so I apologize for the duplication. >>>> >> >> >>>> >> >> Thanks in advance for any help! >>>> >> >> >>>> >> > >>>> >> >When accessing resources with >getResource()/getResourceAsStream(), >>it >>>is >>>> >> >important to remember that there are two different >implementations >>of >>>> >> >these things, which operate quite differently: >>>> >> > >>>> >> >ServletContext.getResource() and >>ServletContext.getResourceAsStream(): >>>> >> >* Can be used to access static resources within your web >application >>>> >> >* Resources is specified as a context-relative URI starting with >"/" >>>> >> >* For example, to read the web.xml file as a resource, you would >use >>>> >> > a resource path of "/WEB-INF/web.xml" >>>> >> >* It doesn't matter whether your webapp is running from an >unpacked >>>> >> > directory or a WAR file, or where the directory/WAR is actually >>>> >> > located. >>>> >> > >>>> >> >ClassLoader.getResource() and ClassLoader.getResourceAsStream(): >>>> >> >* Can be used to access resources embedded within the class >loader >>>> >> > (or class loader hierarchy) >>>> >> >* For a standalone app, that means somewhere on your classpath >>>> >> >* For a webapp installed in Tomcat 4.1, and assuming you're >starting >>>> >> > with the webapp class loader, it checks there and up the >hierarchy >>>> >> > as described in the Tomcat documentation. >>>> >> >* Resource path must match the directory or package structure of >>>> >> > the resource to be retrieved. >>>> >> >* Resource resolution works just like class loading resolution >in >>>> >> > terms of which class loader is searched first. >>>> >> > >>>> >> >To access a resource from a JAR file in shared/lib, then, you >will >>>want to >>>> >> >make sure you're using the second kind of resource retrieval >>methods. >>>> >> >After getting the right methods called, the next most common >problem >>>is >>>> >> >getting your resource path to match the nested directory >structure >>>within >>>> >> >whatever JAR file is holding the resource. >>>> >> > >>>> >> >Craig ___________________________________________________ GO.com Mail Get Your Free, Private E-mail at http://mail.go.com --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]