如何从MBean / RMI类访问特定的WebApp ClassLoader

时间:2013-08-02 10:01:38

标签: tomcat classloader

我认为在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调用?

2 个答案:

答案 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());