Java RMI ne peut pas lier le serveur
Je suis en train de travailler sur Java RMI application, et avoir un problème de liaison à un serveur de la base de registre. Je suis en train de travailler sur eclipse en utilisant rmi plugin, et tout fonctionnait bien avant, j'ai dû formater mon pc. Aussi, je suis sûr que le code est ok, puisque c'est la seule donnée à moi comme une solution, alors il doit y avoir quelque chose de mal avec ma configuration.
Voici le 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, il donne:
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
J'ai étudié le problème et la plupart disent que c'est à cause de la base de paramètres (j'utilise aussi la politique de sécurité), j'ai essayé différents réglages, et actuellement à l'aide du calcul de classpath' option prévue par rmi plugin, qui a travaillé avant, mais ne parvient pas maintenant 🙁 s'il vous Plaît conseils!
Avez-vous essayé de ne pas mettre le "RMISecurityManager'?
Exécuter avec
-Djava.security.debug=access,failure
et voir si quelque chose saute à vousoui, je suis sur windows 7, quand je le lance sans le gestionnaire de sécurité, il me donne: accès refusé ("java.net.SocketPermission" "127.0.0.1:1099" connect résoudre") de java.de sécurité.AccessControlException: accès refusé ("java.net.SocketPermission" "127.0.0.1:1099" connect résoudre") à java.de sécurité.AccessControlContext.checkPermission(AccessControlContext.java:366)
Il dit: -Djava.de sécurité.debug n'est pas reconnu comme une commande interne ou externe...
OriginalL'auteur tomsky | 2011-11-16
Vous devez vous connecter pour publier un commentaire.
FWIW
J'ai mis à niveau à partir de JDK1.6.0_33 à 1.7.0_21 et avait le même problème. J'ai trouvé ce document et résolu le problème en commençant par rmiregistry:
rmiregistry -J-Djava.rmi.server.useCodebaseOnly=false
OriginalL'auteur user1766585
Donc, résumé rapide du problème et de la solution:
Si vous êtes en cours d'exécution sur JDK 7.1/6.29 (possible une autre version) RMI serveur ne va pas se lier si vous définissez sa base de code pour le fichier ou le répertoire sur votre disque dur. Le même code fonctionne très bien en vertu de l'ancienne version du JDK (testé sur 6.24).
Merci pour votre aide!
accepté mais inutile, voir réponse de: user1766585
OriginalL'auteur tomsky
Le problème sous-jacent ici est que le RMI Registre est en cours d'exécution en vertu d'un
SecurityManager
et son .fichier de stratégie ne donne pasjava.io.FilePermission" "\D:\uni\YEAR 3\Enterprise Programming\java\czat solution 2\bin\-" "read"
.L'idée, c'est que c'est un
ServerException
, c'est à dire jeté à la cible de l'appel, et que l'appel lui-même estrebind()
.Voir ce post pour une explication.
OriginalL'auteur user207421
Oui ce problème se produit en Java de 1,7 et au-dessus. Il faut donc toujours passer par les améliorations document si vous mettez à niveau votre version de Java. C'est une solution plutôt simple. Vous avez juste besoin de commencer la
rmiregistry
d'une manière différente.Aller par le biais de ce document- http://docs.oracle.com/javase/7/docs/technotes/guides/rmi/enhancements-7.html
OriginalL'auteur Ruben Bhattacharya
Avez-vous essayé de donner expressément l'accès au fichier à l'aide de l' *.fichier de stratégie?
comme décrit sur
http://docs.oracle.com/javase/7/docs/technotes/guides/security/permissions.html
J'ai le même problème avec openjdk... probablement causé par ce commit:
http://hg.openjdk.java.net/jdk7u/jdk7u-gate/jdk/rev/7ed2fd310470
OriginalL'auteur asura