Java RMI не может связать сервер - PullRequest
7 голосов
/ 16 ноября 2011

Я работаю над приложением Java RMI и испытываю проблемы с привязкой сервера к реестру. Я работаю над затмением, используя плагин 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

Я исследовал проблему и большинство говорит, что это из-за настроек кодовой базы (я также использую политику безопасности), я пробовал другие настройки, и в настоящее время использую опцию 'compute from classpath', предоставленную плагином rmi, который работал раньше, но не работает сейчас :( Пожалуйста, совет!

Ответы [ 5 ]

10 голосов
/ 22 мая 2013

FWIW

Я обновил JDK1.6.0_33 до 1.7.0_21, и у меня возникла та же проблема. Я нашел этот документ и решил проблему, запустив rmiregistry с:

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

3 голосов
/ 18 ноября 2011

Итак, краткое описание проблемы и решения:

Если вы работаете на JDK 7.1 / 6.29 (возможно, в другой версии), сервер RMI не будет связываться, если вы установите его кодовую базуфайл или каталог на вашем жестком диске.Этот же код прекрасно работает в более старой версии JDK (протестировано на 6.24).Спасибо за вашу помощь!

2 голосов
/ 17 ноября 2011

Основная проблема заключается в том, что Реестр RMI работает под SecurityManager, а его .policy файл не предоставляет java.io.FilePermission" "\D:\uni\YEAR 3\Enterprise Programming\java\czat solution 2\bin\-" "read".

Ключом к этому является то, что это ServerException, то есть выброшено в цель вызова, и что сам вызов rebind().

См. этот пост для объяснения.

1 голос
/ 01 ноября 2016

Да, эта проблема возникает в Java 1.7 и выше. Поэтому всегда просматривайте документ по улучшениям, если вы обновляете свою версию Java. Это довольно простое решение. Вам просто нужно запустить rmiregistry по-другому.

Просмотрите этот документ- http://docs.oracle.com/javase/7/docs/technotes/guides/rmi/enhancements-7.html

0 голосов
/ 15 декабря 2011

Вы пытались явно предоставить доступ к файлу, используя файл * .policy? как описано на 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";
}

У меня та же проблема с openjdk ... вероятно, вызванная этим коммитом: http://hg.openjdk.java.net/jdk7u/jdk7u-gate/jdk/rev/7ed2fd310470

...