0

以前は動作していた RMI アプリケーションをセットアップしようとしていますが、現在は奇妙な動作をしています。スタブなしで実行すると、java.lang.ClassNotFoundException: HelloInterface が発生します。次に、(rmic を使用して) ディレクトリに新しいファイル (Hello_Stub) を追加すると、java.lang.ClassNotFoundException: Hello_Stub が発生します。

なに?Hello_Stub が欠落しているときに欠落していると不平を言うことはありませんでした。しかし、そのファイルを追加すると、そこにないという不平を言い始めます。は?

以下は、端末からのトランスクリプトです。最初に 1 つのエラーが表示されます。次に、現在のディレクトリ内のファイルを一覧表示します。次に、スタブ ファイルを生成し、それを示します。次に、追加したばかりのファイルが見つからないというエラーが表示されます。

sjudd@kearnsgroup:/kearnsgroup/www/RMItest/classes> java HelloServer
initializing Hello class: Hello, world!
Hello Server failed: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: HelloInterface


sjudd@kearnsgroup:/kearnsgroup/www/RMItest/classes> ll
total 32
-rw------- 1 sjudd sjudd 765 Oct 25 19:52 Hello.class
-rw------- 1 sjudd sjudd 967 Oct 25 19:52 HelloClient.class
-rw-r----- 1 sjudd sjudd 614 Oct 25 19:42 HelloClient.java
-rw------- 1 sjudd sjudd 222 Oct 25 19:52 HelloInterface.class
-rw-r----- 1 sjudd sjudd 360 Oct 25 09:08 HelloInterface.java
-rw-r----- 1 sjudd sjudd 847 Oct 25 09:56 Hello.java
-rw------- 1 sjudd sjudd 916 Oct 25 19:52 HelloServer.class
-rw-r----- 1 sjudd sjudd 439 Oct 25 09:14 HelloServer.java


sjudd@kearnsgroup:/kearnsgroup/www/RMItest/classes> rmic Hello
sjudd@kearnsgroup:/kearnsgroup/www/RMItest/classes> ll
total 36
-rw------- 1 sjudd sjudd  765 Oct 25 19:52 Hello.class
-rw------- 1 sjudd sjudd  967 Oct 25 19:52 HelloClient.class
-rw-r----- 1 sjudd sjudd  614 Oct 25 19:42 HelloClient.java
-rw------- 1 sjudd sjudd  222 Oct 25 19:52 HelloInterface.class
-rw-r----- 1 sjudd sjudd  360 Oct 25 09:08 HelloInterface.java
-rw-r----- 1 sjudd sjudd  847 Oct 25 09:56 Hello.java
-rw------- 1 sjudd sjudd  916 Oct 25 19:52 HelloServer.class
-rw-r----- 1 sjudd sjudd  439 Oct 25 09:14 HelloServer.java
-rw------- 1 sjudd sjudd 1635 Oct 25 20:34 Hello_Stub.class


sjudd@kearnsgroup:/kearnsgroup/www/RMItest/classes> java HelloServer
initializing Hello class: Hello, world!
Hello Server failed: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: Hello_Stub

ここで失敗しているのは、クライアントではなく rmi SERVER であることに注意してください。

このコードは、あるマシン (Mac) では問題なく動作しますが、別のマシン (Linux) にコピーすると、この驚くべきエラーがスローされます。

この奇妙さに圧倒されすぎて、どうアプローチしたらいいのかわからない。これはアンマーシャリングのステップと何か関係があるのでしょうか? または環境変数で?おそらくCLASSPATH?何を探すべきかわかりません。ワイルドな理論はありますか?

4

2 に答える 2

0

クラスパスに注意を払わずに rmiregistry を開始しました。classes ディレクトリに cd してそこから起動すると、すべての問題が解消されました。

rmir​​egistry プログラムの CLASSPATH またはコードベースを指定するフラグを使用して、同じことを達成できると思います。構文を知っている人はいますか? 私はこれらを

試しまし
た(失敗しました) : -J-DCLASSPATH="/absolute/path/to/classes/"


それらはすべてjava.lang.ClassNotFoundException: BNS.plumbing.SessionHostInterface 、サーバーの実行開始時に発生します。(少なくとも、これは新しい動作です。)

于 2013-10-31T01:33:07.293 に答える
0

スタブを追加しないでください。Java 1.5 以降は必要ありません。Javadoc のプリアンブルに記載されている要件に従っていることを確認してくださいUnicastRemoteObject.。元の問題は、レジストリまたはクライアント、またはその両方への CLASSPATH でリモート インターフェイス クラスが使用できないことが原因です。

于 2013-10-27T22:11:06.700 に答える