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/>
>
> ---------------------------------------------------------------------
> 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]

Reply via email to