Java 远程JMX调用失败,ClassNotFoundException:。。。(无安全管理器:RMI类加载程序已禁用。)
我尝试从Tomcat的web应用程序调用MBean方法。目标MBean在JBoss 4.2.3下运行。Tomcat和JBoss应用程序都使用同一类的同一版本的jar,但在调用时我看到以下异常:Java 远程JMX调用失败,ClassNotFoundException:。。。(无安全管理器:RMI类加载程序已禁用。),java,jboss,rmi,jmx,Java,Jboss,Rmi,Jmx,我尝试从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.loadCla
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类加载器被禁用”。但是如何更改此行为以使用本地已加载的类。或者我猜错了….?在运行服务器时是否提供了-Djava.rmi.server.codebase属性。包括此属性,它应该可以工作。使用-Djava.rmi.server.codebase属性动态类加载实际上很少需要,这非常简单只需将接口和任何序列化类实现编译到客户机和服务器中 有关更多详细信息,请阅读此答案:
这里向阅读本文的任何人澄清一下;当文章中说“将接口+类编译到客户端和服务器中”时,请确保不要在服务器和客户端部署中使用相同的JAR文件。对于客户端,请确保只编译提供的JAR中所需的类。