2011-04-26 5 views
2

スタックオーバーフローのユーザーの皆様。rmi registeryの問題

私は多くのRMIレジストリの問題を読んで、問題は解決しましたが、成功しませんでした。だからここに私の場合があり、私は少しでも私を助けてくれることを願っています。

私は学校プロジェクト用のマルチプレイヤーパックマンを構築しています。私は3つの素敵なjarファイルを作成したので、Java RMIを使用する必要があります。リモートサーバーに物を公開し、マップなどのようなものを読み込むメインクラスを含むサーバー(のみ)。いくつかの素晴らしい形式を表示するいくつかのスイングジャンクを含むクライアント。そして第3は、すべてのパックマンコードを含むライブラリです。

サーバーをローカルで起動すると、rmiregistryが開始され、ゲームが(設定後に)バインドされます。それから、クライアントを接続してうまくプレイできます。すべての作品と私はすべての私のローカルrmiregisteryに接続し、ゲームのオブジェクトをうまく取得するビューのクライアントを開始することができます。 その後、私はサーバーとは独立してレジストリを起動し、プログラムの正常終了を再開しました。私のラップトップのIP(127.0.0.1ではなく)でも、うまくいきました。私はレジストリのクラスパスを設定していないことに注意してください。

その後、私はその物をサーバ(2008年)に移しました。クラスパスを使わずにそこでrmiregistryを開始し、server.jarを接続しようとしましたが失敗しました。 (クラスのexeptionを見つけることができませんでした)クラスパスを修正しても効果がありませんでした。新しいコンソールを開き、pacman.jarをc:\にコピーしてサーバーを実行しました.jarを-Djava.rmi.server.codebase = c:\ parametherとすると効果がありません。セキュリティー・マネージャー(System.setSecurityManager(new RMISecurityManager());)を設定して、ポリシーには:grant {permission java.security.AllPermission;};を実行し、サーバーを実行しました server.jar -Djava.rmi.server.codebase = c:-Djava.security.policy = server.policy ...を使用して、もう一度効果はありません。

私は同じ例外を得続ける:

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
     java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
     java.lang.ClassNotFoundException: Tervoort.Bram.Packman.Spel 
     at sun.rmi.server.UnicastServerRef.oldDispatch(Unknown Source) 
     at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source) 
     at sun.rmi.transport.Transport$1.run(Unknown Source) 
     at java.security.AccessController.doPrivileged(Native Method) 

は、いずれかの問題が何であるかに任意の手掛かりを持っていますか?それを修正する方法は?

+0

はい私は、-Djava.rmi.server.codebase = file:/ c:/packman.jarを〜と同じ結果エラーにしようとしました。 – Bram

答えて

0

Thisも役に立ちます。 A.2を見てください。それは何のためにも理由があるようです。クラス/クラスは、提供されたURLで見つけることができません。 URLが正しく形成され、必要なすべてのクラスがクラスパス上にあることを確認します。

"RMIによってリモートオブジェクトがマーシャリングされている場合(リモート呼び出しの引数または戻り値のいずれであろうと)、スタブクラスのコードベースはRMIによって取得され、シリアル化されたスタブに注釈を付けるために使用されます。 CLASSPATHにクラスがすでに見つかるか、アプレットコードベースなどの受信オブジェクトのコンテキストクラスローダーによってクラスが見つからない場合、RMIClassLoaderを使用してスタブクラスファイルをロードするためにコードベースが使用されます。

_StubクラスRMIClassLoaderによってロードされた場合、RMIはその注釈に使用するコードベースをすでに知っています。_StubクラスがCLASSPATHからロードされていれば、明白なコードベースはなく、RMIはjava.rmi.server.codebaseシステムプロパティを調べてコードベース。システムプロパティが設定されていない場合、スタブはnullコードベースでマーシャリングされます。つまり、クライアントのCLASSPATHに_Stubクラスファイルの一致するコピーがない限り使用できません。

+0

問題は、この場合のspelは、リモートオブジェクトへのインターフェイスであり、クライアントの両方のサーバーのパスにあり、rmiclassloaderからのロードがないことです。多分レジスタリーを除いて – Bram