Pourquoi RMI registre est ignorant la java.rmi.serveur.le code de la propriété
Je suis en cours d'exécution un exemple Hello World pour java RMI
1) je lance le registre dans un dossier vide
motta@motta-laptop ~/tmp $ rmiregistry
2) je démarre le serveur HTTP pour récupérer les classes au moment de l'exécution. Le dossier de téléchargement contient l'interface à distance pour le client-serveur
motta@motta-laptop ~/download $ java NanoHTTPD 8080
3) je démarre le serveur en passant la java.rmi.serveur.le code de la propriété comme le suggère le java RMI tutoriel
motta@motta-laptop ~/server $ java -Djava.rmi.server.codebase="http://localhost:8080" WarehouseServer
Le registre RMI est de ne pas communiquer avec le serveur HTTP et est en train de lancer une exception (voir les détails après la question).
Mais si je ne les suivants
1) Démarrer le registre rmi de java.rmi.serveur.le code de la propriété
motta@motta-laptop ~/tmp $ rmiregistry -J-Djava.rmi.server.codebase="http://localhost:8080/"
2) Démarrer le serveur HTTP comme avant
3) Démarrer le serveur, sans aucune option
motta@motta-laptop ~/server $ java WarehouseServer
il fonctionne, mais pourquoi? Il semble qu'avec la première procédure du RMI registre est ignorant la java.rmi.serveur.le code de la propriété
Merci
=================================
Je suis en cours d'exécution
java version "1.7.0_21"
Java(TM) SE Runtime Environment (build 1.7.0_21-b11)
Java HotSpot(TM) 64-Bit Server VM (build 23.21-b01, mixed mode)
L'exception du RMI registre
Constructing server implementation...
Binding server implementation to registry...
Exception in thread "main" java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: Warehouse
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:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
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.bind(Unknown Source)
at WarehouseServer.main(WarehouseServer.java:14)
Salut EJP, j'ai essayé sans les guillemets et le comportement est le même
Je travaille toujours sur le qui et Il ressemble vraiment à un bug. Le ci-dessus mentionné problème se produit dans mon Linux Mint VM, alors que si je lance le exactement le même code (et de configuration) sur ma machine Windows, tout va bien.
Je confirme que sous Windows je n'ai pas besoin de passer le code de base à l'argument de la rmiregistry, alors que sous Linux Mint, j'ai besoin d'elle j'ai tout enregistré et l'installation d'un dépôt avec l'exemple et les instructions à exécuter github.com/mottalrd/RMITutorial (Entrepôt v1 ensemble de projets)
Est-il possible que sous Linux, vous disposez d'une variable d'environnement CLASSPATH qui est définie lorsque vous démarrez la base de Registre et des points à votre code serveur?
OriginalL'auteur mottalrd | 2013-05-27
Vous devez vous connecter pour publier un commentaire.
C'est correct. La raison en est que, comme de JDK 7u21, le
java.rmi.server.useCodebaseOnly
propriété esttrue
par défaut, tandis que dans les versions précédentes, il étaitfalse
par défaut.Quand
useCodebaseOnly
estfalse
, le RMI Registry (et RMI clients), utilisez le code qui a été transmis à partir du serveur. Maintenant que la valeur par défaut esttrue
le registre et les clients ignorer le serveur de la base de code de propriété. Le registre et les clients doivent définir leur propre code de la propriété pour correspondre à celle du serveur, ou (non recommandé) ils pourraient mettre enuseCodebaseOnly
retour àfalse
. Voir RMI Améliorations dans le JDK 7 pour plus de détails.La RMI Tutoriel n'a pas été mis à jour pour refléter ce changement. Désolé à ce sujet. Je vais faire en sorte qu'il soit mis à jour.
la justification pourrait être la cette vulnérabilité. Les "autres fournisseurs" mentionné est probablement celui-ci.
Le RMI Tutoriel n'a pas encore de mentionner le
useCodebaseOnly
de la propriété. Chaque petit indice, il y aurait aider les gens à obtenir de ne pas confondre pourquoi l'échantillon n'est pas de travail - tout comme moi. Veuillez mettre à jour le tutoriel pour garder la qualité.MONSIEUR, très désolé pour informer, mais le RMI le code n'a pas encore été mis à jour. Il semble que vous avez oublié votre engagement! @StuartMarks
Tutoriel pas encore mis à jour pour Java 8. J'ai juste eu à courir avec cette commande rmiregistry -J-Djava.rmi.serveur.codebase=file:///<chemin d'accès à distance-cours>/
OriginalL'auteur Stuart Marks