我认为在Tomcat中部署了一个Web应用程序。一些MBean已通过JConsole注册并可用。
当我在这个MBean上调用一个操作时,似乎RMI调用的ClassLoader并不特定于已注册MBean的WebApp。给定http://tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.html,我猜它使用Bootstrap,System或Common的ClassLoader。
如何使用已注册MBean的WebApp类加载器执行RMI / MBean调用?
答案 0 :(得分:1)
这是通过引用已经实例化MBean的ClassLoader来实现的:
/** the classLoader to use for future usages */
protected final ClassLoader instanciatingClassLoader;
/** Default constructor */
public MyMonitoringBean() {
// Keep in reference the classLoader used to instanciate this object
this.instanciatingClassLoader = Thread.currentThread().getContextClassLoader();
}
protected ClassLoader getClassLoader() {
return instanciatingClassLoader;
}
它没有解决这个故障,因为对这个MBean的调用是在一个Thread中执行的,而不是WebApp ClassLoader,而是对类加载器的特定调用,如:
getClassLoader().loadClass(className)
可以直接使用webApp类加载器
来解决答案 1 :(得分:0)
这个问题已经有点挂了,但我现在遇到了同样的问题。
我观察到,MBean类的类加载器实际上是MBean所在的web应用程序的类加载器。
这是通过将类的类加载器附加到MBean应该能够访问应用程序类的当前线程:
Thread.currentThread().setContextClassLoader(getClass().getClassLoader());