2011-11-16 21 views
7

Sto lavorando su un'applicazione Java RMI, e avendo problema vincolante un server al Registro di sistema. Sto lavorando su eclipse usando il plugin rmi, e tutto ha funzionato bene prima di dover formattare il mio pc. Inoltre, sono sicuro che il codice è ok dal momento che è quello dato a me come una soluzione, quindi ci deve essere qualcosa di sbagliato con la mia configurazione. Ecco il codice:Java RMI non può legarsi assistente

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

    } 

} 

Eccezioni dà:

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 

ho ricercato il problema e la maggior parte dire che è a causa di impostazioni codebase (Io uso anche la politica di sicurezza), ho provato diverse impostazioni, e attualmente utilizza l'opzione 'calcola da classpath' fornita dal plugin rmi, che ha funzionato prima, ma fallisce subito :(Si prega di consulenza!

+0

siete su Windows ?? – gotomanners

+0

Hai provato a non impostare il 'RMISecurityManager'? – srkavin

+0

Eseguilo con '-Djava.security.debug = access, failure' e vedi se qualcosa ti salta – gotomanners

risposta

3

Quindi, breve riassunto del problema e la soluzione:

se si sta eseguendo il JDK 7.1/6.29 (possibile qualche altra versione) server RMI non si legherà se si imposta la sua base di codice al file o directory sul tuo hard disk. Lo stesso codice funziona bene con la versione precedente di JDK (testato su 6.24). Grazie per il vostro aiuto!

+1

Il problema riguarda specificamente il registro RMI e il file *: codebases. – EJP

+0

accettato ma non utile, vedere la risposta di: user1766585 – Chris

2

Il problema di fondo qui è che il registro RMI viene eseguito con un suo file SecurityManager e .policy non concede java.io.FilePermission" "\D:\uni\YEAR 3\Enterprise Programming\java\czat solution 2\bin\-" "read".

L'indizio è che si tratta di un ServerException, cioè lanciato alla destinazione della chiamata e che la chiamata stessa è rebind().

Vedi this post per una spiegazione.

+0

Grazie, questo spiega molto. La cosa più facile da fare nel mio caso era solo usare la versione precedente di JDK. – tomsky

0

Hai provato ad accedere in modo esplicito al file utilizzando il file * .policy? come descritto a 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"; 
} 

Ho lo stesso problema con OpenJDK ... probabilmente causato da questo impegno: http://hg.openjdk.java.net/jdk7u/jdk7u-gate/jdk/rev/7ed2fd310470

10

FWIW

ho aggiornato da JDK1.6.0_33 a 1,7. 0_21 e ha avuto lo stesso problema. Ho trovato questo document e risolto il problema avviando rmiregistry con:

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

+0

che ha fatto il trucco per me in Java8, così tanto! – Chris

Problemi correlati