こんにちは、Javaクラスをネーミングサーバーにバインドするアプリケーションを実行しようとしていますが、常にClassNotFoundExceptionが発生します。
まず、レジストリを起動します。
rmiregistry
その後、Eclipseからサーバーを実行しようとしましたが、このエラーが発生します
Java.rmi.ServerException:サーバースレッドでRemoteExceptionが発生しました。ネストされた例外は次のとおりです。Java.rmi.UnmarshalException:引数の非整列化エラー。ネストされた例外は次のとおりです。Java.lang.ClassNotFoundException:progInternet2008.commons.NominabileFactory at Sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.Java:396)at Sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.Java:250) Sun.rmi.transport.Transport.serviceCall(Transport.Java:155)のJava.security.AccessController.doPrivileged(Native Method)でのSun.rmi.transport.Transport $ 1.run(Transport.Java:159)Sun.rmiで.transport.tcp.TCPTransport.handleMessages(TCPTransport.Java:535)at Sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run0(TCPTransport.Java:790)at Sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run (TCPTransport.Java:649)at Java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor.Java:886)at Java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.Java:908)at Java.lang。 Thread.run(Thread.Java:619)at Sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.Java:255)at Sun.rmi.transport.StreamR emoteCall.executeCall(StreamRemoteCall.Java:233)at Sun.rmi.server.UnicastRef.invoke(UnicastRef.Java:359)at Sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)at progInternet2008.Pozzobon.tesi.Slave。 main(Slave.Java:54)原因:Java.rmi.UnmarshalException:引数の非整列化エラー。ネストされた例外は次のとおりです。Java.lang.ClassNotFoundException:progInternet2008.commons.NominabileFactory at Sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)at Sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.Java:386)at Sun.rmi .server.UnicastServerRef.dispatch(UnicastServerRef.Java:250)at Sun.rmi.transport.Transport $ 1.run(Transport.Java:159)at Java.security.AccessController.doPrivileged(Native Method)at Sun.rmi.transport。 Transport.serviceCall(Transport.Java:155)at Sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.Java:535)at Sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run0(TCPTransport.Java:790) Sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run(TCPTransport.Java:649)at Java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor.Java:886)at Java.util.concurrent.ThreadPoolExecutor $ Worker .run(ThreadPoolExecutor.Java:908)at Java.lang.Thread.run(Thread.Java:619)原因:Java.lang.ClassNotFoundException:progInternet2 JavaのJava.net.URLClassLoader.findClass(URLClassLoader.Java:188)のJava.security.AccessController.doPrivileged(Native Method)のJava.net.URLClassLoader $ 1.run(URLClassLoader.Java:200)の008.commons.NominabileFactory .lang.ClassLoader.loadClass(ClassLoader.Java:307)at Java.lang.ClassLoader.loadClass(ClassLoader.Java:252)at Java.lang.ClassLoader.loadClassInternal(ClassLoader.Java:320)at Java.lang.Class。 forName0(Native Method)at Java.lang.Class.forName(Class.Java:247)at Sun.rmi.server.LoaderHandler.loadProxyInterfaces(LoaderHandler.Java:711)at Sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler。 Java:655)Sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.Java:592)at Java.rmi.server.RMIClassLoader $ 2.loadProxyClass(RMIClassLoader.Java:628)at Java.rmi.server.RMIClassLoader.loadProxyClass( RMIClassLoader.Java:294)at Sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.Java:238)at Java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.Java:1531) Java.io.ObjectInputStream.readObjectDesc(ObjectInputStream.Java:1493)at Java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.Java:1732)at Java.io.ObjectInputStream.readObject0(ObjectInputStream.Java:1329)at Java.io. ObjectInputStream.readObject(ObjectInputStream.Java:351)...さらに12
RMI Javaチュートリアルを読みましたが、それでも動作しませんでした...
VM引数として、私はこれを設定しました:
-Djava.rmi.server.codebase = file:$ {workspace_loc}/progInternet2008
私を助けてください
(Java 6を使用しています)
/ bin、/ build、または/ build/classesフォルダーのいずれかから、ビルドされたファイルのルートであるrmiregisrty
コマンドを実行します。
私は同じことを解決しようと半日を費やしました。
例外が発生しているのは、rmiregistryアプリケーションがどこからクラスをロードするかわからないためです。 RMIレジストリでオブジェクトをバインドしようとすると、レジストリはそのオブジェクトのクラス定義をダウンロードします。他のいくつかの回答は、起動時にクラス定義があり、何もダウンロードする必要がないようにrmiregistryアプリのクラスパスを設定することでこれを回避するように指示していますが、SunのJava RMIチュートリアルこれをしないように明示的に言っている。これは、レジストリ内のクラスのバージョンとサーバー上のクラスの間で競合を引き起こす可能性があると思います。
問題を処理する正しい方法は、Java.rmi.server.codebaseプロパティを設定しようとしていたことです。このプロパティでは、次のようにディレクトリパスをスラッシュで終了する必要があります。
-Djava.rmi.server.codebase = file:$ {workspace_loc}/progInternet2008 /
$ {workspace_loc}変数が相対パスであり、rmiregistryアプリケーションが同じディレクトリで起動されていないために相対パスが正しくない場合も、問題が発生している可能性があります。パスを絶対パスにするか、適切なディレクトリでrmiregistryを開始すると、ClassNotFoundExceptionはなくなるはずです。もう少し詳しい情報は Java.rmi.server.codebaseプロパティのチュートリアル を参照してください。
さて、私はこの問題を克服しました。 rmiregistry
を実行するときに、CLASSPATH
環境変数が設定されていることを確認してください。
たとえば、次のスクリプトがあるとします。
set CLASSPATH=[path to jdbc driver].jar
rmiregistry.exe
これが、失われたクラスパスを機能させるために必要なすべてでした。送信方法がわかりません-cp commandline
からrmiregistry.exe
。そのドキュメントはかなり不足しています。
アプリケーションと同じクラスパスを使用してRMIサーバーを起動する必要があると確信しています。 Javaと同じパラメータ、つまり-cp [your class path]
。
私は同じ問題を抱えていました。これを修正するには、[〜#〜] classpath [〜#〜]がサーバークラスを含むパスに設定されていることを確認してください実行時rmiregistry。
Linuxマシンで次のコマンドを実行します。
export CLASSPATH="<server_class_path>"
[〜#〜] classpath [〜#〜]が設定されていることを確認してください:
echo $CLASSPATH
クラスパスが設定されたら、rmiregistryを実行します
rmiregistry &
JDK1.6.0_33から1.7.0_45にアップグレードしたところ、同じ問題が発生しました。私はこのドキュメントを見つけ、rmiregistryを次のように開始することで問題を解決しました:
rmiregistry -Djava.rmi.server.useCodebaseOnly = false
以下を参照してください http://docs.Oracle.com/javase/7/docs/technotes/guides/rmi/enhancements-7.html
Rmiregistryが最初に開始されたcmdウィンドウを閉じます。新しいcmdで、プロジェクトクラスファイルが配置されている場所(binまで)に移動し、以下のコマンドを使用してレジストリを開始します。
rmiregistry -J-Djava.rmi.server.useCodebaseOnly = false
Eclipseを使用している場合は、ServerSideProjectを実行すると、実装クラスのインスタンスが指定されたURLにバインドされます。
バインディングメソッドの下に1行印刷して、印刷されるかどうかを確認します。正常に印刷された場合、サーバーは正常に動作しています。
VM Arg:の最後に/ binを追加してみます。
-Djava.rmi.server.codebase=file:${workspace_loc}/progInternet2008/bin
実行するファイルはこのディレクトリにあるため、パスに含める必要があります。
JDKをアンインストールして再インストールし、クラスパスと環境変数を変更するのに丸一日費やしました。しかし、犯人はコマンドstart rmigregistryが適切な方法でrmiregistryを開始しなかったことでした。したがって、このページのコメントに感謝して、解決策は一時的にCLASSPATHをunsetすることでした。そして、それはコマンドset CLASSPATH=