I just sichronized calls of registerClassLoader():
I have created class:
package myapp.aop;
import javassist.ClassPool;
import org.jboss.classpool.plugins.jbosscl.JBossClClassPoolConfig;
import org.jboss.classpool.plugins.jbosscl.JBossClDelegatingClassPoolFactory;
import org.jboss.classpool.spi.ClassLoaderRegistryHandler;
import org.jboss.classpool.spi.ClassPoolRepository;
import org.jboss.logging.Logger;
public class ClassPoolFactory extends JBossClDelegatingClassPoolFactory
{
private final Logger log = Logger.getLogger(ClassPoolFactory.class);
private class Handler implements ClassLoaderRegistryHandler
{
private ClassLoaderRegistryHandler successor;
public ClassPool registerClassLoader(ClassLoader classLoader)
{
ClassPool result;
synchronized(successor)
{
result = successor.registerClassLoader(classLoader);
}
if (result == null)
log.debug("registerClassLoader() returned null, " + classLoader);
return result;
}
public void unregisterClassLoader(ClassLoader classLoader)
{
successor.unregisterClassLoader(classLoader);
}
public void setSuccessor(ClassLoaderRegistryHandler handler)
{
successor = handler;
}
}
public ClassPoolFactory(JBossClClassPoolConfig config)
{
super(config.getDomainRegistry(), config.getRegisterModuleCallback());
config.setClassPoolFactory(this);
ClassPoolRepository.getInstance().setClassPoolFactory(this);
}
public ClassLoaderRegistryHandler create(ClassLoaderRegistryHandler successor)
{
ClassLoaderRegistryHandler handler = new Handler();
handler.setSuccessor(super.create(successor));
return handler;
}
}
and add these lines to the aop.xml file:
...
<classloader name="aop-classloader" xmlns="urn:jboss:classloader:1.0" export-all="NON_EMPTY" import-all="true">
...
<root>${jboss.server.home.url}/lib/myapp-aop.jar</root>
</classloader>
...
<bean name="MyAppClassPoolFactory" class="myapp.ClassPoolFactory">
<constructor>
<parameter>
<inject bean="JBossClClassPoolConfig"/>
</parameter>
</constructor>
</bean>
...
Probably it should work.