1

我考虑部署在 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 调用?

4

2 回答 2

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 的调用是在一个线程中执行的,其中 ClassLoader 不是 WebApp ClassLoader,而是对类加载器的特定调用,例如:

    getClassLoader().loadClass(className)

可以直接使用webApp类加载器来解决

于 2013-08-02T10:23:42.193 回答
0

这个问题已经有点悬了,但我刚刚遇到了同样的问题。

我观察到,MBean 类的类加载器实际上是 MBean 所在的 Web 应用程序的类加载器。

也就是说,通过将类的类加载器附加到当前线程,您的 MBean 应该能够访问应用程序类:

    Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
于 2015-10-23T12:02:28.290 回答