【问题标题】:Remote JMX invocation failed with ClassNotFoundException: ... (no security manager: RMI class loader disabled远程 JMX 调用因 ClassNotFoundException 失败:...(无安全管理器:RMI 类加载器已禁用
【发布时间】:2009-07-29 15:32:08
【问题描述】:

我尝试从 Tomcat 的 Web 应用程序调用 MBean 的方法。目标 MBean 在 JBoss 4.2.3 下运行。 Tomcat 和 JBoss 应用程序都使用相同版本的 jar 和相同的类,但在调用时我看到以下异常:

Caused by: java.lang.ClassNotFoundException: ...thisClass... (no security manager: RMI class loader disabled)
    at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:375)
    at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:165)
    at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:620)
    at org.jboss.system.JBossRMIClassLoader.loadClass(JBossRMIClassLoader.java:91)
    at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:247)
    at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:197)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1575)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1496)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
    at java.util.ArrayList.readObject(ArrayList.java:593)
    at sun.reflect.GeneratedMethodAccessor164.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1849)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
    at java.util.HashMap.readObject(HashMap.java:1030)
    at sun.reflect.GeneratedMethodAccessor163.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1849)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
    at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1667)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1323)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
    at java.rmi.MarshalledObject.get(MarshalledObject.java:142)
    at javax.management.remote.rmi.RMIConnectionImpl$6.run(RMIConnectionImpl.java:1513)
    ... 20 more

我认为 JBoss 不使用自己的类,而是尝试从某个地方下载该类并失败并显示“没有安全管理器:RMI 类加载器已禁用”。但是如何改变这种行为来使用本地已经加载的类。或者我猜错了..?

【问题讨论】:

    标签: java jboss rmi jmx


    【解决方案1】:

    实际上很少需要使用 -Djava.rmi.server.codebase 属性进行动态类加载,只需将接口和任何序列化类实现编译到客户端和服务器中就会简单得多。

    阅读此答案了解更多详情: RMI Question - Where do clients get a definition for remote classes that have not been added to registry?

    【讨论】:

    • 只是为了向任何阅读这篇文章的人澄清一下;当它说“将接口 + 类编译到客户端和服务器中”时,请确保您最终不会为服务器和客户端部署使用相同的 JAR 文件。对于客户端,请确保您只编译提供的 JAR 中所需的类。
    【解决方案2】:

    您是否在运行服务器时提供了 -Djava.rmi.server.codebase 属性。包括此属性,它应该可以工作。

    【讨论】:

      猜你喜欢
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      • 2012-06-21
      • 2015-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多