2011-11-16 120 views
7

我正在研究Java RMI應用程序,並遇到將服務器綁定到註冊表的問題。我正在使用rmi插件進行日食,並且在我必須格式化我的電腦之前,一切正常。另外,我確信代碼是可以的,因爲它是給我的一個解決方案,所以我的配置一定有問題。 下面的代碼:Java RMI無法綁定服務器

public static void main (String[] args){ 

    try{ 

     RMIChatServer myObject = new RMIChatServerImpl(); 

     System.setSecurityManager(new RMISecurityManager()); 

     Naming.rebind("Hello", myObject); 

     System.out.println("Remote object bound to registry"); 
    } 
    catch(Exception e){ 

     System.out.println("Failed to register object " + e); 
     e.printStackTrace(); 
     System.exit(1); 

    } 

} 

例外它給:

Failed to register object java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: access to class loader denied 
java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: access to class loader denied 
    at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:419) 
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:267) 
    at sun.rmi.transport.Transport$1.run(Transport.java:177) 
    at sun.rmi.transport.Transport$1.run(Transport.java:174) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.rmi.transport.Transport.serviceCall(Transport.java:173) 
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    at java.lang.Thread.run(Thread.java:722) 
    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:273) 
    at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:251) 
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:377) 
    at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source) 
    at java.rmi.Naming.rebind(Naming.java:177) 
    at RMIChatServerImpl.main(RMIChatServerImpl.java:175) 
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: access to class loader denied 
    at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source) 
    at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:409) 
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:267) 
    at sun.rmi.transport.Transport$1.run(Transport.java:177) 
    at sun.rmi.transport.Transport$1.run(Transport.java:174) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.rmi.transport.Transport.serviceCall(Transport.java:173) 
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    at java.lang.Thread.run(Thread.java:722) 
Caused by: java.lang.ClassNotFoundException: access to class loader denied 
    at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:447) 
    at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:184) 
    at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:637) 
    at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:264) 
    at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:216) 
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1593) 
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1514) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1750) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) 
    ... 13 more 
Caused by: java.security.AccessControlException: access denied ("java.io.FilePermission" "\D:\uni\YEAR 3\Enterprise Programming\java\czat solution 2\bin\-" "read") 
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:366) 
    at java.security.AccessController.checkPermission(AccessController.java:555) 
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549) 
    at sun.rmi.server.LoaderHandler$Loader.checkPermissions(LoaderHandler.java:1176) 
    at sun.rmi.server.LoaderHandler$Loader.access$000(LoaderHandler.java:1130) 
    at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:411) 
    ... 22 more 

我研究這個問題,最有發言權的,它是因爲代碼庫的設置(我也用安全策略),我已經嘗試了不同的設置,並且目前使用rmi插件提供的「從類路徑計算」選項,該工具之前有效,但現在失敗:(請指教!)

+0

你在Windows? – gotomanners

+0

您是否嘗試過不設置'RMISecurityManager'? – srkavin

+0

用'-Djava.security.debug = access,failure'運行它,看看是否有東西跳到你的身上 – gotomanners

回答

3

所以,問題和解決方案的快速摘要:

如果你在JDK中運行,如果你的代碼庫設置爲文件7.1/6.29(可能其他一些版本)RMI服務器將不綁定或目錄在您的硬盤上。在舊版JDK下相同的代碼工作得很好(在6.24上測試)。 感謝您的幫助!

+1

問題出在RMI Registry和* file:* codebases上。 – EJP

+0

接受但沒有幫助,請參閱答案:user1766585 – Chris

2

這裏的底層問題是RMI註冊表正在運行SecurityManager .policy文件未授予java.io.FilePermission" "\D:\uni\YEAR 3\Enterprise Programming\java\czat solution 2\bin\-" "read"

對此的線索是,這是一個ServerException,即投向呼叫的目標,並且呼叫本身是rebind()

查看this post的解釋。

+0

謝謝,這解釋了很多。在我的情況下,最簡單的事情就是使用舊版本的JDK。 – tomsky

10

FWIW

我升級從JDK1.6.0_33至1.7。 0_21並且有同樣的問題。我發現這個document並通過與rmiregistry的開始解決了這個問題:

rmiregistry -J-Djava.rmi.server.useCodebaseOnly=false

+0

在Java8中爲我做了詭計,非常感謝! – Chris