[OT] Classloader troubles

2004-01-15 Thread Nicolas De Loof
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.


-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Re: [OT] Classloader troubles

2004-01-15 Thread Kris Schneider
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]



Re: [OT] Classloader troubles

2004-01-15 Thread Nicolas De Loof
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]



Re: [OT] Classloader troubles

2004-01-15 Thread Kris Schneider
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]



Re: [OT] Classloader troubles

2004-01-15 Thread Nicolas De Loof
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]