2009-07-29 85 views
5

我嘗試從Tomcat的Web應用程序中調用MBean的方法,目標MBean在JBoss 4.2.3下運行Tomcat和JBoss應用程序使用的jar的相同版本的同一個班級,但調用我看到以下異常:遠程JMX調用失敗,出現ClassNotFoundException:...(沒有安全管理器:禁用RMI類加載器

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類加載器被禁用「。但是如何改變這種行爲以使用本地已經加載的類。或者我猜錯了這個猜測..?

回答

0

是否在運行server.include這個屬性時提供了-Djava.rmi.server.codebase屬性,它應該可以工作。

1

使用-Djava.rmi.server.codebase屬性加載動態類幾乎不需要,只需將接口和任何序列化類實現編譯到客戶端和服務器中就簡單多了。

閱讀這個答案詳細信息: RMI Question - Where do clients get a definition for remote classes that have not been added to registry?

+0

只是爲了澄清這裏的人閱​​讀這篇文章;當它說「將接口+類編譯到客戶端和服務器」時,確保最終不會爲服務器和客戶端部署使用相同的JAR文件。對於客戶端,確保只編譯提供的JAR中所需的類。 – 2011-07-02 05:41:00