2

Java rmi を使用して簡単なプロジェクトを作成し、実行可能な jar ファイルにエクスポートしました。実行しようとすると、例外が発生することもあれば、動作することもあります。-Djava.rmi.server.codebase=file:serverClasses/ を指定すると、jar ファイルが正しく作成されていないようです。スタックトレースは次のとおりです。

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: com.ServerBootstrap.IServer
    at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:413)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:267)
    at sun.rmi.transport.Transport$1.run(Transport.java:177)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:636)
    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:273)
    at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:251)
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:377)
    at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
    at java.rmi.Naming.rebind(Naming.java:177)
    at com.v3q6.eece411.A2.ServerBootstrap.ChatRoomServer.main(ChatRoomServer.java:37)
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: com.ServerBootstrap.IServer
    at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
    at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:403)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:267)
    at sun.rmi.transport.Transport$1.run(Transport.java:177)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:173)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:636)
Caused by: java.lang.ClassNotFoundException: com.ServerBootstrap.IServer
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:323)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:268)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:336)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)
    at sun.rmi.server.LoaderHandler.loadProxyInterfaces(LoaderHandler.java:728)
    at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:672)
    at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:609)
    at java.rmi.server.RMIClassLoader$2.loadProxyClass(RMIClassLoader.java:646)
    at java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:311)
    at sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:255)
    at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1548)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1510)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1749)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1346)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:368)
    ... 12 more

プログラムがコードベースを認識していないようです。私の場合、すべてのファイルはローカルです。誰が問題が何であるか知っていますか?ありがとう

4

3 に答える 3

3

com.ServerBootstrap.IServerコードベース内のクラスを含む JAR ファイルの名前を明示的に指定してみてください。

-Djava.rmi.server.codebase=file:serverClasses/myjarfile.jar

JavaTM RMI を使用した動的コードのダウンロード (java.rmi.server.codebase プロパティの使用)」ドキュメントには、codebase の使用とその仕様のオプションに関する詳細情報が記載されています。

于 2009-10-02T04:48:46.387 に答える
0

これは完全なスタック トレースではありません。問題の根本原因を示す部分が省略されている可能性があります。

私の記憶が正しければ、ClassNotFoundException は、ロードされているクラスまたはそれが依存するクラスの静的初期化中にスローされた例外が原因である場合があります。これが発生すると、ネストの次のレベルで、問題の最初のスタック トレースにネストされた例外として表示されます。アプリケーションが試行されたクラスのロードを繰り返す場合、結果のスタックトレースに初期化例外が含まれていないことを思い出します (おそらく間違っています)。

編集: 完全なスタック トレースは、私の理論が正しくないことを示しています。

于 2009-10-02T04:20:24.663 に答える
0

に相対パスを指定してjava.rmi.server.codebase、クライアントの起動時に正しいディレクトリ (「serverClasses」の親ディレクトリ) にいることを確認してください。それを確認するのが難しい場合は、コードベースの絶対パスの方が信頼性が高い可能性があります。

また、オプションを指定して実行すると、-jarオプション-classpathは完全に無視されることに注意してください。ここではそれは問題ではないと思います。RMIClassLoaderこれは、サーバーのコードベース設定を使用して引き続き機能するはずです。ただし、クラスパスで指定された追加のクラスにアクセスできるクライアントに依存している場合、それは機能しません。Class-pathメイン JAR ファイルのマニフェストで属性を使用する必要があります。

于 2009-10-02T04:40:38.167 に答える