Re: shared resources - a final answer?
Can anyone tell me which is right? Do shared resources across applications go in $CATALINA_HOME/common or $CATALINA_HOME/shared? The HOWTO doc. says the shared dir. is the place to put these resources. http://jakarta.apache.org/tomcat/tomcat-4.1-doc/class-loader-howto.html However, Paul tells me that I need to put jar files under $CATALINA_HOME/common directory since they can be seen by both engine and application and that $CATALINA_HOME/shared directory are only available to Catalina engine, not my applications. I do not have the WROX book he refers to. My test worked with a shared JAR file in the common dir. but failed with the JAR file in the shared dir. so it appears the doc. is wrong. Is this a known bug or am I reading the documentation wrong? Thanks. -Original Message- From: Paul Hsu[EMAIL PROTECTED] To: Pat McGroin[EMAIL PROTECTED] Date: Mon Mar 31 08:53:29 PST 2003 Subject: Re: shared resources Todd, You are right based on HOWTO document. The information I provided to you is from wrox's professional tomcat book. But your case seems tell us the HOWTO document is wrong. How do you think? Paul - Original Message - From: Pat McGroin [EMAIL PROTECTED] To: Tomcat Users List [EMAIL PROTECTED] Cc: Paul Hsu [EMAIL PROTECTED] Sent: Monday, March 31, 2003 8:10 AM 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
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
RE: 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
Re: Re: shared resources
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
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.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
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
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! ___ 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]
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 - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]