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.html >> >> >> >> 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]