Hi Casey,

I agree, resolving class loader problems is not easy. But it does have a
bit of logic :-)

The solution you found ( put everything in common/ ) is ok - that's how
tomcat worked in 3.2 and before, and still works.

Resolving the problem with a separate class loader for container is a bit
more difficult - the main benefit is that the container implementation (
modules and libs that are used - including jaxp ) are separated from the
web application.

> attempt 1:
> 
> For each contextInit, TagPoolManagerInterceptor called
> TagPoolManager.setDefaultManager with a newly created TagPoolManagerImpl,
> yet when the jsp called TagPoolManager.getDefaultManager, the static
> reference set in setDefaultManager came back null.

Try to do a println( TagPoolManager.getClassLoader().toString() ) every
time you use it. You'll see what happens ( 2 different class loaders ).

You can also try to print the parent loader.


> Giving up on that, I tried 2:
> 
> Use no statics, just call Context.setAttribute in the interceptor.  In
> the jsp use Context.getAttribute.  The object that comes back is
> the exact same TagPoolManagerImpl that was put there by the interceptor
> but if I try to cast it to a TagPoolManager (or TagPoolManagerImpl for
> that matter), I get a ClassCastException.

Same problem - different class loaders -> different classes :-)

> I was originally trying to follow the model of JspFactory.  I modeled my
> interceptor after the JspInterceptor, but no luck for me.  I noticed that
> sevlet.jar was both in TC_HOME/lib and TC_HOME/lib/common.  Maybe that's

That was fixed recently, servlet.jar should be only in common.


> why JspFactory works.  I jared up the TagPool* classes and stuck them into
> TC_HOME/lib/common and everything worked.  Even though it worked, it didn't
> seem right putting jasper.runtime.Tag* classes into the common directory.
> Any help / suggestions would be greatly appreciated.

jasper.runtime is now in common ( we did a number of fixes since M1 ). 
Everything that should be visible to webapps ( and jasper runtime is one
example - since jsps are using the classes from runtime ) should be in 
common ( i.e. visible in both apps and container ).

Jasper itself ( the compiler ) is in a separate loader.

Think of the container as another application, that happens to provide
some services to other apps. 

The common dir is what all applications are seeing ( including the
container ). Each app has it's own local jars, providing the local
functionality. The container provides jsp compilation, configuration, 
and other services that are used by tomcat. 

Costin


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

Reply via email to