Laufender rmi-Server, classnotfound [duplicate]

Lesezeit: 7 Minuten

Laufender rmi Server classnotfound duplicate
Maurizio Pozzobon

Hallo, ich versuche, eine Java-Anwendung auszuführen, die eine Klasse an den Namensserver bindet, aber ich erhalte ständig eine ClassNotFoundException

Als erstes starte ich die Registry:

Registrierung

dann versuche ich von Eclipse aus, den Server auszuführen, bekomme aber diesen Fehler

java.rmi.ServerException: RemoteException im Server-Thread aufgetreten; verschachtelte Ausnahme ist: java.rmi.UnmarshalException: error unmarshalling arguments; Die verschachtelte Ausnahme ist: java.lang.ClassNotFoundException: progInternet2008.commons.NominabileFactory at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:396) at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250) at sun.rmi.transport.Transport$1.run(Transport.java:159) bei java.security.AccessController.doPrivileged(native Methode) bei sun.rmi.transport.Transport.serviceCall(Transport.java:155) bei sun.rmi .transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535) bei sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790) bei sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run (TCPTransport.java:649) unter java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) unter java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) unter java.lang. Thread.run(Thread.java:619) bei sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255) bei sun.rmi.transport.StreamR emoteCall.executeCall(StreamRemoteCall.java:233) bei sun.rmi.server.UnicastRef.invoke(UnicastRef.java:359) bei sun.rmi.registry.RegistryImpl_Stub.rebind(unbekannte Quelle) bei progInternet2008.Pozzobon.tesi.Slave. main(Slave.java:54) Verursacht durch: java.rmi.UnmarshalException: Fehler beim Unmarshalling von Argumenten; Die verschachtelte Ausnahme ist: java.lang.ClassNotFoundException: progInternet2008.commons.NominabileFactory unter sun.rmi.registry.RegistryImpl_Skel.dispatch (unbekannte Quelle) unter sun.rmi.server.UnicastServerRef.oldDispatch (UnicastServerRef.java:386) unter sun.rmi .server.UnicastServerRef.dispatch(UnicastServerRef.java:250) bei sun.rmi.transport.Transport$1.run(Transport.java:159) bei java.security.AccessController.doPrivileged(native Methode) bei sun.rmi.transport. Transport.serviceCall(Transport.java:155) bei sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535) bei sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790) bei sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649) bei java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) bei java.util.concurrent.ThreadPoolExecutor$Worker .run(ThreadPoolExecutor.java:908) bei java.lang.Thread.run(Thread.java:619) Verursacht durch: java.lang.ClassNotFoundException: progInternet2 008.commons.NominabileFactory bei java.net.URLClassLoader$1.run(URLClassLoader.java:200) bei java.security.AccessController.doPrivileged(Native Method) bei java.net.URLClassLoader.findClass(URLClassLoader.java:188) bei java .lang.ClassLoader.loadClass(ClassLoader.java:307) bei java.lang.ClassLoader.loadClass(ClassLoader.java:252) bei java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320) bei java.lang.Class. forName0 (native Methode) bei java.lang.Class.forName(Class.java:247) bei sun.rmi.server.LoaderHandler.loadProxyInterfaces(LoaderHandler.java:711) bei sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler. java:655) bei sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:592) bei java.rmi.server.RMIClassLoader$2.loadProxyClass(RMIClassLoader.java:628) bei java.rmi.server.RMIClassLoader.loadProxyClass( RMIClassLoader.java:294) bei sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:238) bei java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1531) bei java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1493) bei java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732) bei java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) bei java.io. ObjectInputStream.readObject(ObjectInputStream.java:351) … 12 mehr

Ich habe das RMI-Java-Tutorial gelesen, konnte es aber immer noch nicht zum Laufen bringen …

Als VM-Argumente habe ich Folgendes festgelegt:

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

Bitte hilf mir

(Ich verwende Java 6)

  • Hast du dieses Problem am Ende behoben?

    – Nathan Feger

    18. März 09 um 17:56 Uhr

  • Eine Datei: Codebase-URL funktioniert nur, wenn sich Client und Server auf demselben Computer befinden, in diesem Fall benötigen Sie die Codebase-Funktion überhaupt nicht, oder wenn sie sich auf ein gemeinsam genutztes Laufwerk bezieht, das von Client und Server gleich aussieht , was ein LAN impliziert, wobei wiederum fraglich ist, ob man das Feature überhaupt braucht.

    – Benutzer207421

    6. Juni 13 um 12:17 Uhr

Führen Sie die aus rmiregisrty Befehl aus Ihrem /bin-, /build- oder /build/classes-Ordner, je nachdem, welcher Ordner das Stammverzeichnis Ihrer erstellten Dateien ist.

Ich habe einen halben Tag damit verbracht, dasselbe Problem zu lösen.

  • Vielen Dank! Es funktionierte nur für den einfachsten Lauf (nur lokal).

    – Misiek

    18. April 16 um 9:03 Uhr

  • Du hast 25 Menschen gerettet!

    – Jalal Sordo

    20. Februar 18 um 0:31 Uhr

  • Danke, das war die Antwort, die ich brauchte! Ich bin noch einen Schritt weiter gegangen und habe einfach die Registrierung in meinem Code mit dem Befehl gestartet LocateRegistry.createRegistry(1099);

    – Lolynns

    2. Juli 19 um 16:03 Uhr

  • @lolynns Du verdienst eine Medaille

    – Gilbert

    27. April 20 um 8:50 Uhr

  • Für Intellij-Jungs ist der Ordner out/production/myrmi. Derjenige, der .class-Dateien hat

    – Gilbert

    27. April 2020 um 08:54 Uhr


Laufender rmi Server classnotfound duplicate
A. Abgabe

Die Ausnahme tritt auf, weil die Rmiregistry-Anwendung nicht weiß, woher Klassen geladen werden sollen. Wenn Sie versuchen, ein Objekt in der RMI-Registrierung zu binden, lädt die Registrierung die Klassendefinition für dieses Objekt herunter. Einige der anderen Antworten fordern Sie auf, dies zu umgehen, indem Sie den Klassenpfad für die rmiregistry-App so festlegen, dass sie beim Start die Klassendefinitionen enthält und nichts herunterladen muss, außer dem Java-RMI-Tutorial von Sun sagt ausdrücklich, dies nicht zu tun. Ich vermute, dass dies Konflikte zwischen der Version der Klasse in der Registrierung und der Klasse auf dem Server verursachen kann.

Der richtige Weg, um das Problem zu lösen, besteht darin, die Eigenschaft java.rmi.server.codebase so zu setzen, wie Sie es versucht haben. Die Eigenschaft erfordert, dass ein Verzeichnispfad mit einem Schrägstrich abgeschlossen wird, etwa so:

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

Sie können auch Probleme haben, wenn die Variable ${workspace_loc} ein relativer Pfad ist und die rmiregistry-Anwendung nicht im selben Verzeichnis gestartet wurde, sodass der relative Pfad dafür nicht korrekt ist. Wenn Sie entweder den Pfad absolut machen oder die rmiregistry im entsprechenden Verzeichnis starten, sollte die ClassNotFoundException verschwinden. Siehe die Tutorial zur Eigenschaft java.rmi.server.codebase für etwas genauere Informationen.

  • Das Tutorial sagt das nur, weil es die Codebase-Funktion verwendet und die Codebase-Funktion unterbricht. Sonst ist es kein Thema.

    – Benutzer207421

    6. Juni 13 um 12:13 Uhr

1643219230 702 Laufender rmi Server classnotfound duplicate
Nathan Feger

Okay, ich habe dieses Problem gerade überwunden. Stellen Sie sicher, wenn Sie laufen rmiregistry dass Ihr CLASSPATH Umgebungsvariable gesetzt.

Zum Beispiel könnten Sie ein Skript haben:

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

Das war alles, was ich brauchte, um meinen verlorenen Klassenpfad zum Laufen zu bringen. Ich bin mir nicht sicher, wie ich senden soll -cp commandline zu rmiregistry.exe. Seine Dokumentation ist ziemlich mangelhaft.

  • Die RMI-Tutorials von Sun weisen ausdrücklich darauf hin, dies nicht zu tun. Es kann Probleme verursachen.

    – A. Abgabe

    14. Mai 09 um 18:59 Uhr

  • @A.Levy Wo genau sagen sie das? Dies kann nur dann zu Problemen führen, wenn die Codebase-Funktion verwendet wird.

    – Benutzer207421

    6. Juni 13 um 12:11 Uhr

  • positiv bewerten. Dies ist die einzige Lösung, die von den letzten 10 Fragen funktioniert. useCodeBaseOnly=false funktioniert nicht als Argument. -Djava.security.policy=Datei, die alle Berechtigungen setzt, funktioniert auch nicht. -Djava.rmi.server.codebase=some.jar funktioniert nicht wie von anderen angemerkt…

    – Rui Botelho

    5. März ’15 um 20:00 Uhr

Vorgehensweise beim Herstellen einer Verbindung zu einer Amazon RDS Oracle Instance
Atul Patel

Schließen Sie das cmd-Fenster, in dem die rmiregistry ursprünglich gestartet wurde. Gehen Sie in einem neuen cmd zu dem Speicherort, an dem sich Ihre Projektklassendateien befinden (bis bin), und starten Sie die Registrierung mit dem folgenden Befehl:

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

Wenn Sie Eclipse verwenden, führen Sie das ServerSideProject aus, und Ihre ImplementationClass-Instanz wird an die angegebene URL gebunden.

Drucken Sie einfach eine Zeile unter der Bindungsmethode aus und sehen Sie nach, ob sie gedruckt wird. Wenn es erfolgreich gedruckt wird, bedeutet dies, dass Ihr Server einwandfrei funktioniert.

  • Wenn Sie RMI-Server sagen, meinen Sie damit die rmiregistry-Anwendung oder die Serverkomponente der Anwendung im Vergleich zur Client-Komponente?

    – simginer

    27. Oktober 17 um 1:22 Uhr

Versuchen Sie, /bin am Ende Ihrer VM-Argumentation hinzuzufügen:

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

Die Datei, die Sie ausführen werden, befindet sich in diesem Verzeichnis, daher müssen Sie sie in den Pfad aufnehmen.

  • In der Frage gibt es keine Hinweise darauf, dass sich die Klassendateien im bin-Verzeichnis befinden.

    – Benutzer207421

    6. Juni 13 um 12:15 Uhr

1643219231 474 Laufender rmi Server classnotfound duplicate
Munish Kronleuchter

Ich habe von JDK1.6.0_33 auf 1.7.0_45 aktualisiert und hatte das gleiche Problem. Ich habe dieses Dokument gefunden und das Problem gelöst, indem ich rmiregistry gestartet habe mit:

rmiregistry -Djava.rmi.server.useCodebaseOnly=false

Siehe unten
http://docs.oracle.com/javase/7/docs/technotes/guides/rmi/enhancements-7.html

  • In der Frage gibt es keine Hinweise darauf, dass sich die Klassendateien im bin-Verzeichnis befinden.

    – Benutzer207421

    6. Juni 13 um 12:15 Uhr

1643219231 639 Laufender rmi Server classnotfound duplicate
Dylan R Coss

Ich hatte das gleiche Problem, um dies zu beheben, stellen Sie sicher, dass Ihr KLASSENPFAD wird auf den Pfad gesetzt, der beim Ausführen die Serverklassen enthält Registrierung.

Führen Sie auf einem Linux-Computer die folgenden Befehle aus.

export CLASSPATH="<server_class_path>"

Sicherstellen, dass die KLASSENPFAD wurde gesetzt:

echo $CLASSPATH

Sobald der Klassenpfad festgelegt wurde, führen Sie ihn aus Registrierung

rmiregistry &

.

649340cookie-checkLaufender rmi-Server, classnotfound [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy