2011-11-16 117 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