2

RMIシステムをコーディングしていると、クライアント側で例外の問題が発生しました

Exception in thread "main" java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
    java.lang.ClassNotFoundException: com.cs.entity.LectureCourse
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:178)
    at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:178)
    at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:132)
    at $Proxy1.getNamedClass(Unknown Source)
    at com.cs.test.ClientCRUD.main(ClientCRUD.java:40)

RMIコードベース機能を使用しcom.cs.entity.LectureCourseて実行時にクライアントがダウンロードする必要があるクラスであることを確認しました

  1. サーバー VM 引数のコードベースが正しく設定されており、
  2. クライアント VM オプション -Djava.security.policy= も正しく設定されています。
  3. -Djava.rmi.server.hostname は、レジストリが正しく取得されるようにするためにも使用されます

クライアントとサーバーを同じノードで実行すると動作しますが、別の物理マシンがサーバーとクライアントを別々に保持している場合、クライアントに例外が表示されます。

誰もこの問題を以前に見たことがありますか? 助けてください...

@EJP

以下は、RMI レジストリを開始するために使用したコードです (Tomcat 7 contextInitialized 内)。

        final String value = "http://192.168.1.11:8080/csl/";
        System.out.println(value);
        System.setProperty("java.rmi.server.codebase", value);

        registry = LocateRegistry.createRegistry(8899)

これは、クライアントでレジストリを検索するために使用したコードです

    System.setSecurityManager(new RMISecurityManager());

    final String HOST = "192.168.1.11";
    final int port = 8899;
    final Registry registry = LocateRegistry.getRegistry(HOST, port);

それらは正しく機能していると思いますが、エラーは私を大いに苛立たせます

問題がどこにあるかを見つけると思います。前述のように、Web プロジェクトの起動時に呼び出される Tomcat 7 の contextInitialized メソッドで RMI レジストリが起動されました。独立したメイン アプリケーション内にある場合、RMI サーバー用の同じコードがかなりうまく機能することがわかります。さまざまな RMI サーバー構成でのいくつかのテストによると、次のように結論付けました。

  1. Tomcat 7のcontextInitializedメソッドは、通常のJavaメインプログラムとは異なることを行います
  2. よくわかりませんが、コードベースは、URL(私はWebサーバーを使用しています)がディレクトリではなく特定のjarファイルを示している場合にのみ機能するようです。(これは、チュートリアルまたはそのようなものに対する私の誤解である可能性があります)

では、Tomcat 7 が RMI レジストリを別の方法で開始しないのはなぜでしょうか? 私はまだそれに取り組んでいます

4

1 に答える 1

0

Tomcat 7のcontextInitializedメソッドは、通常のJavaメインプログラムとは異なることを行います

もちろんそうです。しかし、あなたが具体的にどのような期待を持っているかを知らなければ、これ以上コメントすることはできません.

よくわかりませんが、コードベースは、URL(私はWebサーバーを使用しています)がディレクトリではなく特定のjarファイルを示している場合にのみ機能するようです。(これは、チュートリアルまたはそのようなものに対する私の誤解である可能性があります)

ダウンロードは 1 回だけなので、はるかにうまく機能します。コードベース サーバー全体に .class ファイルをばらまく必要はありません。1 つまたは複数の JAR ファイルをデプロイするだけです。

RMI が特に指示されずにディレクトリから JAR ファイルをロードすることを期待している場合は、ロードされません。JAR ファイルに名前を付けない場合、.class ファイルが検索されます。

于 2013-01-17T09:56:33.513 に答える