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
て実行時にクライアントがダウンロードする必要があるクラスであることを確認しました
- サーバー VM 引数のコードベースが正しく設定されており、
- クライアント VM オプション -Djava.security.policy= も正しく設定されています。
- -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 サーバー構成でのいくつかのテストによると、次のように結論付けました。
- Tomcat 7のcontextInitializedメソッドは、通常のJavaメインプログラムとは異なることを行います
- よくわかりませんが、コードベースは、URL(私はWebサーバーを使用しています)がディレクトリではなく特定のjarファイルを示している場合にのみ機能するようです。(これは、チュートリアルまたはそのようなものに対する私の誤解である可能性があります)
では、Tomcat 7 が RMI レジストリを別の方法で開始しないのはなぜでしょうか? 私はまだそれに取り組んでいます