I have resolved this issue, but am wondering if the way I did it is the 
"correct" way to resolve this issue.
   
  I modified the catalina.properties file entry common.loader by adding the 
path to the applications WEB-INF/classes directory, this seems to have resolved 
the issue with finding the class.
   
   
  
common.loader=${catalina.home}/common/classes,<snip>,${catalina.home}/webapps/myExternalApp/WEB-INF/classes
   
   
   
  I also had to fix a bug in the retrieval of the method (I read the API docs 
incorrectly)
   
     private static final Object OBJECT_ARG_LIST[] = new Object[0];
   private static final Class CLASS_ARG_LIST[] = new Class[0];

                 Method method = 
singletonClassObj.getMethod(GET_INSTANCE_METHOD,
                     CLASS_ARG_LIST);
               method.invoke(null, OBJECT_ARG_LIST);

   
   
  Mike Peremsky <[EMAIL PROTECTED]> wrote:
  I tried the modification you suggested (with the correct method name on the 
end) but still with the same results. I also printed out a debug message just 
to see what class loader was being used (not that I know what to do with it :-P 
)

log.debug("this class loader: " + 
this.getClass().getClassLoader().getClass().getName());
Class singletongClassObj = 
this.getClass().getClassLoader().loadClass(singletonClassName); 

The class loader for the SingletonLoader is: 
org.apache.catalina.loader.StandardClassLoader.

The classes that it is looking for are located in the 

/apache-tomcat-5.5.23/webapps/myExternalApp/WEB-INF/classes directory.




Filip Hanik - Dev Lists wrote:
did you try

Class singletongClassObj = 
this.getClass().getClassLoader().loadName(singletonClassName); 

Filip


Mike Peremsky wrote:
> I think this may be a class loader issue, but am not sure as I have never 
> really worked with them before. I am putting together a JAR file that 
> contains a set of classes to be used throughout a suite of applications. I 
> have a class called SingletonLoader that was working when it was within the 
> main application, but when I broke out the reusable classes into a separate 
> jar file and modified the contextInitialized() method to dynamically load the 
> classes it is failing to fid the classes. The contextInitialized() method is 
> properly reading the class names from the property file (e.g. 
> SINGLETON_LOADER_CLASSES=com.externalApp.singleton.Countries,com.externalApp.singleton.SecurityQuestions)
>  and looping through them, but I always get the following error message when 
> the line 
> 
> Class singletongClassObj = Class.forName(singletonClassName); 
> 
> is executed:
> 
> Unable to load singleton: com.externalApp.singleton.Countries
> java.lang.ClassNotFoundException: com.externalApp.singleton.Countries
> 
> ALL of the singleton classes to be loaded implement the Singleton interface 
> (which has nothing in it, it is just used to denote a class that MUST specify 
> a "public static anyReturnVal getInstance()" method.
> 
> public class SingletonLoader implements ServletContextListener, SystemConsts {
> /**
> * Logger for this class
> */
> private static final Logger log = Logger.getLogger(SingletonLoader.class);
> private static final String SINGLETON_LOADER_CLASSES
> = "SINGLETON_LOADER_CLASSES";
> private static final String DELIMITER = ",";
> // This is the method defined
> private static final String GET_INSTANCE_METHOD = "getInstance";
> private static final Object ARG_LIST[] = new Object[0];
> 
> /**
> * Constructs a new SingletonLoader object.
> */
> public SingletonLoader() {
> }
> 
> /**
> * Notification that the web application is ready to process requests.
> * 
> * Initializes all of the singletons so they are ready for immediate use
> * after the containet server starts.
> * 
> * @param sce This is the event object for notifications about changes to the
> * servlet context of a web application.
> * 
> */
> public void contextInitialized(ServletContextEvent sce) {
> 
> log.debug("contextInitialized: BEGIN");
> String singletons = ExtProperties.getProperty(SYS_PROPS, 
> SINGLETON_LOADER_CLASSES);
>
> if (!StringUtils.isNullOrZeroLen(singletons)) {
> DelimitedString ds = new DelimitedString(singletons, DELIMITER);
> int max = ds.size();
> String singletonClassName = null;
> 
> for (int ndx=0; ndx < max; ndx++) {
> try {
> singletonClassName = ds.getEntry(ndx);
> log.debug("Get singletonClassName: " + singletonClassName);
> // Get the singleton class to load
> Class singletongClassObj = Class.forName(singletonClassName);
> log.debug("singletongClassObj: " + singletongClassObj);
> Method method = singletongClassObj.getMethod(GET_INSTANCE_METHOD,
> singletongClassObj);
> method.invoke(null, ARG_LIST);
> 
> } catch (Exception e) {
> log.error("Unable to load singleton: " + singletonClassName, e);
> }
> }
> }
> log.debug("contextInitialized: END");
> }
> 
> /**
> * Notification that the servlet context is about to be shut down.
> *
> * @param sce the ServletContextEvent
> */
> public void contextDestroyed(ServletContextEvent sce) {
> }
> }
> 
> Example of the Countries singleton
> 
> 
> public class Countries implements DbConsts, Singleton {
> private static Logger log = Logger.getLogger(Countries.class);
> 
> 
> 
> /** Creates a new instance of Countries */
> private Countries() {
> refreshData();
> }
> 
> /**
> * Returns the single instance of this class.
> *
> * @return the instance of this class.
> */
> public static Countries getInstance() {
> if (instance == null) {
> synchronized (Countries.class) {
> if (instance == null) {
> instance = new Countries();
> }
> }
> }
> return instance;
> }
>
> 
> }
>
> 
> ---------------------------------
> Be a better Globetrotter. Get better travel answers from someone who knows.
> Yahoo! Answers - Check it out.
> 
> ------------------------------------------------------------------------
>
> No virus found in this incoming message.
> Checked by AVG Free Edition. 
> Version: 7.5.467 / Virus Database: 269.7.1/805 - Release Date: 5/15/2007 
> 10:47 AM
> 


---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]





---------------------------------
Luggage? GPS? Comic books? 
Check out fitting gifts for grads at Yahoo! Search.

       
---------------------------------
Give spam the boot. Take control with tough spam protection
in the all-new Yahoo! Mail Beta.

Reply via email to