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]




This e-mail, including any attachments, is a confidential business communication, and 
may contain information that is confidential, proprietary and/or privileged.  This 
e-mail is intended only for the individual(s) to whom it is addressed, and may not be 
saved, copied, printed, disclosed or used by anyone else.  If you are not the(an) 
intended recipient, please immediately delete this e-mail from your computer system 
and notify the sender.  Thank you.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to