29

こんにちは、クラスをネーミング サーバーにバインドする Java アプリケーションを実行しようとしていますが、常に ClassNotFoundException が発生します。

まず、レジストリを開始します。

rmiレジストリ

次に、Eclipseからサーバーを実行しようとしましたが、このエラーが発生しました

java.rmi.ServerException: サーバースレッドで RemoteException が発生しました。ネストされた例外は次のとおりです: java.rmi.UnmarshalException: 引数の非整列化エラー。ネストされた例外は次のとおりです。 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) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang .Thread.run(Thread.java:619)、sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255)、sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233)、sun.rmi. server.UnicastRef.invoke(UnicastRef.java:359) で sun.rmi.registry.RegistryImpl_Stub.rebind(不明なソース) で progInternet2008.Pozzobon.tesi.Slave.main(Slave.java:54) 原因: java.rmi. UnmarshalException: 引数の非整列化エラー。ネストされた例外: java.lang.ClassNotFoundException: progInternet2008.commons.NominabileFactory at sun.rmi.registry.RegistryImpl_Skel.

RMI Java チュートリアルを読みましたが、まだ機能しませんでした...

VM引数として、私はこれを設定しました:

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

私を助けてください

(私は Java 6 を使用しています)

4

9 に答える 9

66

rmiregisrty/bin、/build、または /build/classes フォルダー (ビルドされたファイルのルートであるフォルダー) からコマンドを実行します。

同じことを解決するために半日を費やしました。

于 2015-11-09T02:03:40.747 に答える
27

rmir​​egistry アプリケーションがどこからクラスをロードするかを認識していないため、例外が発生しています。RMI レジストリでオブジェクトをバインドしようとすると、レジストリはそのオブジェクトのクラス定義をダウンロードします。他の回答のいくつかは、rmiregistry アプリのクラスパスを設定して、起動時にクラス定義を持ち、何もダウンロードする必要がないようにすることで、これを回避するように指示していますが、Sun の Java RMI チュートリアルでは、そうしないように明示的に述べています。これ。これにより、レジストリ内のクラスのバージョンとサーバー上のクラスの間で競合が発生する可能性があると思われます。

この問題を処理する正しい方法は、java.rmi.server.codebase プロパティを設定することです。このプロパティでは、次のようにディレクトリ パスをスラッシュで終了する必要があります。

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

${workspace_loc} 変数が相対パスであり、rmiregistry アプリケーションが同じディレクトリで開始されていないため、相対パスが正しくない場合にも問題が発生する可能性があります。パスを絶対パスにするか、適切なディレクトリで rmiregistry を開始すると、ClassNotFoundException は発生しなくなります。もう少し詳しい情報については、java.rmi.server.codebase プロパティのチュートリアルを参照してください。

于 2009-04-22T22:55:31.283 に答える
7

さて、私はこの問題を克服しました。実行時に環境変数が設定されていることを確認しrmiregistryてください。CLASSPATH

たとえば、次のスクリプトがあるとします。

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

失われたクラスパスを機能させるために必要なのはこれだけでした。-cp commandlineへの送信方法がわかりませんrmiregistry.exe。そのドキュメントはかなり不足しています。

于 2009-02-16T21:18:54.273 に答える
4

アプリケーションと同じクラスパスを使用して RMI サーバーを起動する必要があることは間違いありません。Java と同じパラメーター、つまり -cp を使用すると思います[your class path]

于 2009-01-21T10:36:07.150 に答える
3

rmir​​egistry が最初に開始された cmd ウィンドウを閉じます。新しい cmd で、プロジェクトのクラスファイルがある場所 (bin まで) に移動し、以下のコマンドを使用してレジストリを開始します。

rmir​​egistry -J-Djava.rmi.server.useCodebaseOnly=false

Eclipse を使用している場合は、ServerSideProject を実行すると、ImplementationClass インスタンスが指定された URL にバインドされます。

製本方法の下に行を印刷して、それが印刷されるかどうかを確認してください。正常に印刷された場合は、サーバーが正常に動作していることを意味します。

于 2016-04-19T10:07:28.917 に答える
2

VM引数の最後に/binを追加してみてください。

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

実行するファイルはこのディレクトリにあるため、パスに含める必要があります。

于 2010-11-26T10:20:55.297 に答える
2

これを修正するには、 rmiregistryを実行するときにCLASSPATHがサーバークラスを含むパスに設定されていることを確認してください。

Linux マシンで次のコマンドを実行します。

export CLASSPATH="<server_class_path>"

CLASSPATHが設定されていることを確認します。

echo $CLASSPATH

クラスパスが設定されたら、rmiregistryを実行します。

rmiregistry &
于 2015-11-07T23:07:43.697 に答える
1

JDK のアンインストールと再インストール、およびクラスパスと環境変数の変更に 1 日を費やしました。しかし、原因は、コマンドstart rmigregistryが適切な方法で rmiregistry を開始しなかったことです。したがって、このページのコメントに感謝します。解決策は、CLASSPATH を一時的に設定解除することでした。そして、それはコマンドを介して行われますset CLASSPATH=

于 2012-03-10T19:30:07.167 に答える