Api is in a separate jar (api.jar) that is both in webapp & commons : when I don't put it in commons, I get a NoClassDefFoundError from line (1) :
Class clazz = Class.forName(className); I can't exclude it from webapp (WEB-INF/lib) as it is part of webapp with the production implementation jar. I need some way to force ClassLoading to search webapp first, even when it delegates a class search to commons ClassLoader. Perhaps they're is no solution... Nico. > Where is the JAR file that contains IExternalSystem? > > Quoting Nicolas De Loof <[EMAIL PROTECTED]>: > > > the webapp hasn't trouble to load ExternalSystemMockImpl. It uses reflexion > > to do it from some configuration data that > > is use to set implementation (production | mock). > > > > The problem is that the resulting object has to be casted to an interface > > from the API : IExternalSystem: > > > > (1) Class clazz = Class.forName(className); > > (2) return (IExternalSystem) clazz.newInstance(); > > > > from webapp, I think IExternalSystem is loaded by webapp ClassLoader. As > > ExternalSystemMockImpl is loaded from tomcat > > "commons" ClassLoader, it doesn implements the IExternalSystem loaded by this > > commons-ClassLoader, that cannot be casted > > in IExternalSystem loaded by webapp-ClassLoader. > > > > I get a ClassCastException on line 2. > > > > Nico. > > > > > > > > > If ExternalSystemMockImpl is contained in a JAR file that's in > > > $CATALINA_HOME/common/lib, I don't see why the app wouldn't be able to load > > it. > > > For example, I've got a JAR file for the Oracle JDBC driver in common/lib > > and I > > > can do the following just fine in a JSP: > > > > > > <% > > > ClassLoader cl = getClass().getClassLoader(); > > > Class clazz = cl.loadClass("oracle.jdbc.OracleDriver"); > > > Object obj = clazz.newInstance(); > > > %> > > > > > > If there's code in the external JAR file that needs to make use of a > > class > > > loader, it should probably use the result of > > > Thread.currentThread().getContextClassLoader(). Can you provide a little > > more > > > detail on how the app is using reflection to locate > > ExternalSystemMockImpl? > > > > > > Quoting Nicolas De Loof <[EMAIL PROTECTED]>: > > > > > > > Hi all, > > > > > > > > I'm posting on Struts list because I know they're is lot's of J2EE > > experts > > > > here. > > > > > > > > I want to test my webapp on Tomcat, but it depends on some external > > system. > > > > I've got a jar that emulates it. When I > > > > package it with the webapp (WEB-INF/lib) it works fine. > > > > > > > > I would like to test the webapp packaged without this emulator jar. I > > tried > > > > putting it in $TOMCAT/common/lib. I get a > > > > ClassCastException. I think it comes from this : > > > > > > > > webapp requires the external API, let's say a class named > > "ExternalSystem". > > > > It is configured to search for an > > > > implementation class named "ExternalSystemMockImpl" (using reflexion > > API). > > > > > > > > Webapp classloader doesn't find it, and delegate class searh to it's > > parent > > > > classloader (tomcat ones). Parent > > > > classloader finds the class from my emulator jar, run it and return > > some > > > > "MockResult" object, that implements > > > > "ExternalResult" from the external API > > > > > > > > Calling webapp tries to cast resulting object to "ExternalResult", class > > that > > > > is visible to webapp classloader. > > > > > > > > Then my code is doing : > > > > > > > > ExternalResult result = (ExternalResult) obj; > > > > > > > > where obj is my MockResult instance, that implements ExternalResult > > from > > > > parent-Classloader, and casting it to a > > > > webapp-Classloader ExternalResult fails ! > > > > > > > > > > > > How can I solve this ClasLoader conflict ? > > > > > > > > Nico. > > > > > > -- > > > Kris Schneider <mailto:[EMAIL PROTECTED]> > > > D.O.Tech <http://www.dotech.com/> > > -- > Kris Schneider <mailto:[EMAIL PROTECTED]> > D.O.Tech <http://www.dotech.com/> > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]