Java RMI cannot bind server

I am working on a Java RMI application and have problems binding the server to the registry. I am working on eclipse using the rmi plugin and everything worked fine before I had to format my computer. In addition, I am sure that the code is in order, since it was provided to me as a solution, so there should be something wrong with my configuration. Here is 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 that he 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 investigated the problem, and most of them say that it is because of the code settings (I also use a security policy), I tried different settings and currently use the "calculate from class" parameter provided by the rmi plugin that worked before, but does not work now :( Please advice!

+7
source share
5 answers

So, a brief overview of the problem and solution:

If you are running on JDK 7.1 / 6.29 (possibly some other version), the RMI server will not communicate if you install your code base in a file or directory on your hard drive. The same code works very well in the old version of the JDK (tested on 6.24). Thanks for the help!

+3
source

Fwiw

I upgraded from JDK1.6.0_33 to 1.7.0_21 and had the same problem. I found this document and resolved the issue by running rmiregistry with:

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

+10
source

The main problem is that the RMI registry runs under SecurityManager , and its .policy file does not provide java.io.FilePermission" "\D:\uni\YEAR 3\Enterprise Programming\java\czat solution 2\bin\-" "read" .

The key to this is that it is a ServerException , that is, it is thrown at the target of the call and that the rebind() call rebind() .

See this post for an explanation.

+2
source

Yes, this problem occurs in Java 1.7 and later. Therefore, if you are updating the Java version, always review the enhancement document. This is a fairly simple solution. You just need to start rmiregistry in a different way.

Go through this document - http://docs.oracle.com/javase/7/docs/technotes/guides/rmi/enhancements-7.html

+1
source

Have you tried explicitly granting access to the file using the * .policy file? as described at 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 problem with openjdk ... possibly caused by this commit: http://hg.openjdk.java.net/jdk7u/jdk7u-gate/jdk/rev/7ed2fd310470

0
source

All Articles