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]

Reply via email to