Re: Classloading question

2002-12-21 Thread Craig R. McClanahan
On Fri, 20 Dec 2002, Madere, Colin wrote:

 Date: Fri, 20 Dec 2002 18:11:22 -0600
 From: Madere, Colin [EMAIL PROTECTED]
 Reply-To: Tomcat Users List [EMAIL PROTECTED]
 To: 'Tomcat Users List' [EMAIL PROTECTED]
 Subject: Classloading question

 I put a jar in tomcat home/common/lib/ that has some base servlet classes
 I wrote.  When writing apps, I derive from these classes.  Works fine.

 I put the velocity.jar file in the WEB-INF/lib folder of each app for using
 the singleton model of Velocity (jakarta.apache.org/velocity) so that each
 web app has it's own engine instance.  Works fine.

 I try to combine the two above by putting my base class jar in the
 /common/lib/ which has classes derived from the velocity.jar at the app
 level and I get a class loading error since apparently classes defined at
 the container level do not look in the /WEB-INF/lib for classes.  If I put
 the base class jar that's in /common/lib/ in WEB-INF/lib it works, but I
 shouldn't have to do that.  And the reverse also works (putting the velocity
 jar in the /common/lib/), but breaks the idea of the Velocity singleton
 model since all apps on the server will be sharing the same velocity engine
 and therefore all velocity-related resources (template location, log
 location, etc).

 Is there any way out of having to copy my base class jar into every web app?


The fundamental rule of Java class loaders is that they look *up* the
class loader hierarchy, not down (where the primoridial bootstrap class
loader of the JVM is considered to be at the top of the tree).

The consequence of this is that, when your classes have dependencies on
each other, the class being depended on must be loaded from the same class
loader as the dependent class, or from a class loader higher than the one
loading the dependent class.

In Tomcat terms, for example, that means it's illegal to have a dependent
class loaded from common/lib/ that depends on a class loaded from
/WEB-INF/lib, although the opposite arrangement is legal.

Regarding Velocity in particular, I'm sure you've noticed that static
variables declared in a class that's loaded from common/lib are global to
all webapps.  It's possible for class libraries to program around that by
cleverly using the context class loader provided by the app server (i.e.
Tomcat makes the webapp class loader available while you're processing a
request via Thread.currentThread().getContextClassLoader()), but this must
be done deliberately by the class library author.  It sounds like you
might want to suggest this to the Velocity developers, so that you can put
velocity.jar in common/lib but still have per-webapp resource definitions.

 Colin


Craig


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




RE: Classloading question

2002-12-21 Thread Madere, Colin
What I figured, thanks for the confirmation.

As for Velocity, there's another method of use that would work with the jar
in common/lib, but it's just a tad more involved and I was hoping to skip
it.  Not a big deal, thanks again for the input.

Colin

 -Original Message-
 From: Craig R. McClanahan [SMTP:[EMAIL PROTECTED]]
 Sent: Saturday, December 21, 2002 12:50 PM
 To:   Tomcat Users List
 Subject:  Re: Classloading question
 
 On Fri, 20 Dec 2002, Madere, Colin wrote:
 
  Date: Fri, 20 Dec 2002 18:11:22 -0600
  From: Madere, Colin [EMAIL PROTECTED]
  Reply-To: Tomcat Users List [EMAIL PROTECTED]
  To: 'Tomcat Users List' [EMAIL PROTECTED]
  Subject: Classloading question
 
  I put a jar in tomcat home/common/lib/ that has some base servlet
 classes
  I wrote.  When writing apps, I derive from these classes.  Works fine.
 
  I put the velocity.jar file in the WEB-INF/lib folder of each app for
 using
  the singleton model of Velocity (jakarta.apache.org/velocity) so that
 each
  web app has it's own engine instance.  Works fine.
 
  I try to combine the two above by putting my base class jar in the
  /common/lib/ which has classes derived from the velocity.jar at the app
  level and I get a class loading error since apparently classes defined
 at
  the container level do not look in the /WEB-INF/lib for classes.  If I
 put
  the base class jar that's in /common/lib/ in WEB-INF/lib it works, but I
  shouldn't have to do that.  And the reverse also works (putting the
 velocity
  jar in the /common/lib/), but breaks the idea of the Velocity singleton
  model since all apps on the server will be sharing the same velocity
 engine
  and therefore all velocity-related resources (template location, log
  location, etc).
 
  Is there any way out of having to copy my base class jar into every web
 app?
 
 
 The fundamental rule of Java class loaders is that they look *up* the
 class loader hierarchy, not down (where the primoridial bootstrap class
 loader of the JVM is considered to be at the top of the tree).
 
 The consequence of this is that, when your classes have dependencies on
 each other, the class being depended on must be loaded from the same class
 loader as the dependent class, or from a class loader higher than the one
 loading the dependent class.
 
 In Tomcat terms, for example, that means it's illegal to have a dependent
 class loaded from common/lib/ that depends on a class loaded from
 /WEB-INF/lib, although the opposite arrangement is legal.
 
 Regarding Velocity in particular, I'm sure you've noticed that static
 variables declared in a class that's loaded from common/lib are global to
 all webapps.  It's possible for class libraries to program around that by
 cleverly using the context class loader provided by the app server (i.e.
 Tomcat makes the webapp class loader available while you're processing a
 request via Thread.currentThread().getContextClassLoader()), but this must
 be done deliberately by the class library author.  It sounds like you
 might want to suggest this to the Velocity developers, so that you can put
 velocity.jar in common/lib but still have per-webapp resource definitions.
 
  Colin
 
 
 Craig
 
 
 --
 To unsubscribe, e-mail:
 mailto:[EMAIL PROTECTED]
 For additional commands, e-mail:
 mailto:[EMAIL PROTECTED]

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