web-dev-qa-db-fra.com

Exécution de RMI Server, ClassNotfound

Salut, je suis en train d'exécuter un Java application qui lie une classe au serveur de noms, mais je reçois constamment ClassNotFoundException

Tout d'abord je commence le Registre:

rmiregistry

puis d'Eclipse je tente d'exécuter le serveur, mais obtenir cette erreur

Java.rmi.ServerException: RemoteException est produite en fil de serveur; exception imbriquée est: Java.rmi.UnmarshalException: erreur arguments unmarshalling; exception imbriquée est: java.lang.ClassNotFoundException: progInternet2008.commons.NominabileFactory à Sun.rmi.server.UnicastServerRef.oldDispatch (UnicastServerRef.Java:396) à Sun.rmi.server.UnicastServerRef.dispatch (UnicastServerRef.Java:250) à Sun.rmi.transport.Transport $ 1.run (Transport.Java:159) à Java.security.AccessController.doPrivileged (native Method) à Sun.rmi.transport.Transport.serviceCall (Transport.Java:155) à Sun.rmi .transport.tcp.TCPTransport.handleMessages (TCPTransport.Java:535) à Sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run0 (TCPTransport.Java:790) à Sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run (TCPTransport.Java:649) à java.util.concurrent.ThreadPoolExecutor $ Worker.runTask (ThreadPoolExecutor.Java:886) à java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.Java:908) à java.lang. Thread.run (Thread.Java:619) à Sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer (StreamRemoteCall.Java:255) à Sun.rmi.transport.StreamR emoteCall.executeCall (StreamRemoteCall.Java:233) à Sun.rmi.server.UnicastRef.invoke (UnicastRef.Java:359) à Sun.rmi.registry.RegistryImpl_Stub.rebind (Source inconnue) à progInternet2008.Pozzobon.tesi.Slave. principal (Slave.Java:54) provoquée par: Java.rmi.UnmarshalException: arguments de unmarshalling d'erreur; exception imbriquée est: java.lang.ClassNotFoundException: progInternet2008.commons.NominabileFactory à Sun.rmi.registry.RegistryImpl_Skel.dispatch (Source inconnue) à Sun.rmi.server.UnicastServerRef.oldDispatch (UnicastServerRef.Java:386) à Sun.rmi .server.UnicastServerRef.dispatch (UnicastServerRef.Java:250) à Sun.rmi.transport.Transport 1.run $ (Transport.Java:159) à Java.security.AccessController.doPrivileged (native Method) à Sun.rmi.transport. Transport.serviceCall (Transport.Java:155) à Sun.rmi.transport.tcp.TCPTransport.handleMessages (TCPTransport.Java:535) à Sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run0 (TCPTransport.Java:790) à Sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run (TCPTransport.Java:649) à java.util.concurrent.ThreadPoolExecutor $ Worker.runTask (ThreadPoolExecutor.Java:886) à java.util.concurrent.ThreadPoolExecutor $ travailleur .run (ThreadPoolExecutor.Java:908) à Java.lang.Thread.run (Thread.Java:619) provoquée par: java.lang.ClassNotFoundException: progInternet2 008.commons.NominabileFactory à java.net.URLClassLoader $ 1.run (URLClassLoader.Java:200) à Java.security.AccessController.doPrivileged (Native Method) à Java.net.URLClassLoader.findClass (URLClassLoader.Java:188) à Java .lang.ClassLoader.loadClass (ClassLoader.Java:307) à Java.lang.ClassLoader.loadClass (ClassLoader.Java:252) à Java.lang.ClassLoader.loadClassInternal (ClassLoader.Java:320) à java.lang.Class. forName0 (méthode native) à Java.lang.Class.forName (Class.Java:247) à Sun.rmi.server.LoaderHandler.loadProxyInterfaces (LoaderHandler.Java:711) à Sun.rmi.server.LoaderHandler.loadProxyClass (LoaderHandler. Java: 655) à Sun.rmi.server.LoaderHandler.loadProxyClass (LoaderHandler.Java:592) à Java.rmi.server.RMIClassLoader $ 2.loadProxyClass (RMIClassLoader.Java:628) à Java.rmi.server.RMIClassLoader.loadProxyClass ( RMIClassLoader.Java:294) à Sun.rmi.server.MarshalInputStream.resolveProxyClass (MarshalInputStream.Java:238) à Java.io.ObjectInputStream.readProxyDesc (ObjectInputStream.Java:1531) à Java.io.ObjectInputStream.readClassDesc (ObjectInputStream.Java:1493) à Java.io.ObjectInputStream.readOrdinaryObject (ObjectInputStream.Java:1732) à Java.io.ObjectInputStream.readObject0 (ObjectInputStream.Java:1329) à java.io. ObjectInputStream.readObject (ObjectInputStream.Java:351) ... 12 plus

J'ai lu le RMI Java tutoriel mais ne pouvait toujours pas faire fonctionner ...

Comme VM Arguments J'ai mis ceci:

-Djava.rmi.server.codebase = fichier: $ {} workspace_loc/progInternet2008

aidez-moi, s'il vous plaît

(J'utilise Java 6)

21
Maurizio Pozzobon

Exécutez la commande rmiregisrty à partir du dossier de votre/bac,/de construction ou/de catégorie/classes, quel que soit le dossier correspond à la racine de vos fichiers construits.

J'ai passé une demi-journée à essayer de résoudre la même chose.

48
Marcelo Lazaroni

L'exception se produit car l'application RMireGistry ne sait pas où charger des cours de. Lorsque vous essayez de lier un objet dans le registre RMI, le registre télécharge la définition de classe pour cet objet. Certaines des autres réponses vous indiquent à contourner cela en définissant la classe de classe de l'application RMireGistry afin qu'il dispose des définitions de la classe lorsqu'il est démarré et n'a rien à télécharger, mais Sun's Java RMI Tutoriel dit explicitement de ne pas le faire. Je suppose que cela a le potentiel de causer des conflits entre la version de la classe dans le registre et la classe sur le serveur.

La bonne façon de gérer le problème est de définir la propriété Java.RMI.Server.codeBase comme vous étiez à faire. La propriété exige qu'un chemin de répertoire soit terminé avec une barre oblique, comme:

[.____] - DJAVA.RMI.SERVER.CODEBASE = File: $ {WORKSPACE_LOC}/PROGINTERNETT2008 /[.____]

Vous pouvez également avoir des problèmes si la variable $ {WORKSPACE_LOC} est un chemin relatif et l'application RMIREGRY n'a pas été démarrée dans le même répertoire, de sorte que le chemin relatif n'est pas correct pour cela. Si vous créez le chemin absolu ou démarrez le RMIREGRY dans le répertoire approprié, la clastingNotFoundException devrait disparaître. Voir le Tutoriel sur la propriété Java.RMI.Server.CodeBase pour une information de peu plus détaillée.

24
A. Levy

Ok je viens de surmonter ce problème. Assurez-vous que lorsque vous exécutez rmiregistry que votre variable d'environnement CLASSPATH est définie.

Par exemple, vous pourriez avoir un script:

set CLASSPATH=[path to jdbc driver].jar
rmiregistry.exe

Ce fut tout ce dont j'avais besoin pour avoir mon path de classe de classe. Je ne sais pas comment envoyer -cp commandline à rmiregistry.exe. Sa documentation manque tout à fait.

6
Nathan Feger

Je suis assez certain que vous devrez démarrer votre serveur RMI en utilisant le même niveau de classe que votre application. Je crois que cela prend les mêmes paramètres que Java, c'est-à-dire. -CP [your class path].

4
falstro

J'avais le même problème, pour résoudre ce problème, assurez-vous que votre [~ # ~] classpath [~ # ~ ~] est réglé sur le chemin contenant les classes de serveur Lorsque vous courez rmiregistry.

Sur une machine Linux exécutez les commandes suivantes.

export CLASSPATH="<server_class_path>"

Assurez-vous que [~ # ~ # ~] [~ # ~ ~] a été réglé:

echo $CLASSPATH

Une fois que le chemin de classe a été défini, exécuté rmiregistry

rmiregistry &
2
Dylan R Coss

J'ai mis à jour de JDK1.6.0_33 au 1.7.0_45 et j'ai eu le même problème. J'ai trouvé ce document et résolu le problème en démarrant RmireGistry avec:

rmiregistry -djava.rmi.server.usecodebaseonly = false

Reportez-vous ci-dessous http://docs.oracle.com/javase/7/docs/technotes/guides/rmi/enhancements-7.html

2
Munish Chandel

essayez d'ajouter/bin à la fin de votre VM arg:

-Djava.rmi.server.codebase=file:${workspace_loc}/progInternet2008/bin

Le fichier que vous exécuterez figure dans ce répertoire, vous devez donc l'inclure sur le chemin.

2
howl

J'ai passé toute une journée à désinstaller et à réinstaller mon JDK et à changer les variables de classe et d'environnement. Mais le coupable était que la commande démarrez RMIGregistry Distnt 'Start RmireGistry de manière appropriée. Donc, merci pour les commentaires sur cette page, la solution était de non définie le point de classe temporairement. Et cela se fait à travers la commande set CLASSPATH=

1
Abraham