Please keep this discussion on the Jakarta commons developer list. > The problem i am getting is when I try to add an interceptor to the > service. The class loader used by javassist to compile the > class is it's > own one - javassist.ClassPool.SimpleClassLoader, not the > class loader used > in this case to bootstrap the system. > > So it can't find the classes (in this case the > AbstractLoggingInterceptor) > already loaded by the URL class loader when creating the intercepted > classes - the call to 'return > _pool.writeAsClass(_ctClass.getName());' in > ClassFabImpl#createClass fails with an > NoClassDefFoundException. I added > some debug and just before the call to the writeAsClass method, the > AbstractLoggingInterceptor can be loaded. > > It may be that I am trying to be too clever here - maybe it > is best to > have the classpath defined on the command line - or move the > application > into an application server.
Class loader issues are the hardest to setup and test from within JUnit and Maven. This sounds like a bug to me. I'll double check which class loader is used by the interceptor when fabricating classes. Hm. In order to do the class manipulation, we need a class loader that has visibility to the HiveMind classes (specifically, the abstract base class for the interceptor instance) as well as visibility to the service interface (i.e., the service extension point module's class loader). In your scenario, I don't know that that ispossible. My assumptions were that HiveMind would be in the system classpath and you might add a URL classloader on top of that to suck in modules from other locations. The work around is to fiddle with your URL class loader; I would suggest multiple levels: build a URL class loader that loads HiveMind and its dependencies (from your message, I'm assuming you are using reflection to bridge from the system class loader to the HiveMind libraries in some way). The HiveMind class loader should be the parent of the class loaders for the remaining modules. I think another, simpler option for you would be to use Ant to run your production app. If necessary, have a short shell script or batch file that invokes Ant, use Ant to set the bootstrap classpath (at least the HiveMind library/dependencies). People seem to overlook that Ant is useful for more than just building code. -- Howard M. Lewis Ship Creator, Tapestry: Java Web Components http://jakarta.apache.org/tapestry http://jakarta.apache.org/commons/sandbox/hivemind/ http://javatapestry.blogspot.com --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
