简体   繁体   English

Java RMI无法绑定服务器

[英]Java RMI cannot bind server

I'm working on Java RMI application, and having problem binding a server to the registry. 我正在研究Java RMI应用程序,并且在将服务器绑定到注册表时遇到问题。 I'm working on eclipse using rmi plugin, and everything worked fine before I had to format my pc. 我正在使用rmi插件进行eclipse,在我不得不格式化我的电脑之前一切正常。 Also, I'm sure the code is ok since it's the one given to me as a solution, so there must be something wrong with my configuration. 此外,我确信代码是正确的,因为它是作为解决方案给我的那个,所以我的配置一定有问题。 Here's the code: 这是代码:

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);

    }

}

Exceptions it gives: 它给出的例外情况:

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

I researched the problem and most say that it's because of codebase settings (I also use security policy), I have tried different settings, and currently using 'compute from classpath' option provided by rmi plugin, which worked before, but fails now :( Please advice! 我研究了这个问题,大多数人说这是因为代码库设置(我也使用安全策略),我尝试了不同的设置,目前正在使用rmi插件提供的“计算来自类路径”选项,之前有效,但现在失败了:(请指教!

FWIW FWIW

I upgraded from JDK1.6.0_33 to 1.7.0_21 and had the same problem. 我从JDK1.6.0_33升级到1.7.0_21并遇到了同样的问题。 I found this document and resolved the problem by starting rmiregistry with: 我找到了这个文件并通过启动rmiregistry解决了这个问题:

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

So, quick summary of the problem and the solution: 所以,快速总结问题和解决方案:

If you're running on JDK 7.1/ 6.29 (possible some other version) RMI server will not bind if you set its codebase to the file or directory on your hard disk. 如果您在JDK 7.1 / 6.29(可能是某些其他版本)上运行,则在将其代码库设置为硬盘上的文件或目录时,RMI服务器将不会绑定。 The same code works just fine under older version of JDK (tested on 6.24). 相同的代码在旧版本的JDK(在6.24上测试)下工作正常。 Thanks for your help! 谢谢你的帮助!

The underlying problem here is that the RMI Registry is running under a SecurityManager and its .policy file doesn't grant java.io.FilePermission" "\\D:\\uni\\YEAR 3\\Enterprise Programming\\java\\czat solution 2\\bin\\-" "read" . 这里的根本问题是RMI注册表SecurityManager下运行, .policy文件不授予java.io.FilePermission" "\\D:\\uni\\YEAR 3\\Enterprise Programming\\java\\czat solution 2\\bin\\-" "read"

The clue to that is that this is a ServerException , ie thrown at the target of the call, and that the call itself is rebind() . 线索是这是一个ServerException ,即抛出调用的目标,并且调用本身是rebind()

See this post for an explanation. 请参阅此帖子以获得解释。

Yes this problem occurs in Java 1.7 and above. 是的,Java 1.7及更高版本中会出现此问题。 So always go through the enhancements document if you upgrade your Java version. 因此,如果升级Java版本,请始终查看增强功能文档。 It is a fairly simple solution. 这是一个相当简单的解决方案。 You just need to start the rmiregistry in a different way. 你只需要以不同的方式启动rmiregistry

Go through this document- http://docs.oracle.com/javase/7/docs/technotes/guides/rmi/enhancements-7.html 浏览此文档 - http://docs.oracle.com/javase/7/docs/technotes/guides/rmi/enhancements-7.html

Have you tried to explicitly give access to the file using the *.policy file? 您是否尝试使用* .policy文件明确授予对该文件的访问权限? as described on http://docs.oracle.com/javase/7/docs/technotes/guides/security/permissions.html http://docs.oracle.com/javase/7/docs/technotes/guides/security/permissions.html中所述

grant codebase "file:/path/to/code" {
    permission java.io.FilePermission "\D:\uni\YEAR 3\Enterprise Programming\java\czat solution 2\bin\-", "read";
}

I have the same issue with openjdk... probably caused by this commit: http://hg.openjdk.java.net/jdk7u/jdk7u-gate/jdk/rev/7ed2fd310470 我对openjdk也有同样的问题...可能是由于这个提交造成的: http//hg.openjdk.java.net/jdk7u/jdk7u-gate/jdk/rev/7ed2fd310470

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM