web-dev-qa-db-ja.com

rmiサーバーの実行、classnotfound

こんにちは、Javaクラスをネーミングサーバーにバインドするアプリケーションを実行しようとしていますが、常にClassNotFoundExceptionが発生します。

まず、レジストリを起動します。

rmir​​egistry

その後、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を使用しています)

21

/ bin、/ build、または/ build/classesフォルダーのいずれかから、ビルドされたファイルのルートであるrmiregisrtyコマンドを実行します。

私は同じことを解決しようと半日を費やしました。

48

例外が発生しているのは、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プロパティのチュートリアル を参照してください。

24
A. Levy

さて、私はこの問題を克服しました。 rmiregistryを実行するときに、CLASSPATH環境変数が設定されていることを確認してください。

たとえば、次のスクリプトがあるとします。

set CLASSPATH=[path to jdbc driver].jar
rmiregistry.exe

これが、失われたクラスパスを機能させるために必要なすべてでした。送信方法がわかりません-cp commandlineからrmiregistry.exe。そのドキュメントはかなり不足しています。

6
Nathan Feger

アプリケーションと同じクラスパスを使用してRMIサーバーを起動する必要があると確信しています。 Javaと同じパラメータ、つまり-cp [your class path]

4
falstro

私は同じ問題を抱えていました。これを修正するには、[〜#〜] classpath [〜#〜]がサーバークラスを含むパスに設定されていることを確認してください実行時rmiregistry

Linuxマシンで次のコマンドを実行します。

export CLASSPATH="<server_class_path>"

[〜#〜] classpath [〜#〜]が設定されていることを確認してください:

echo $CLASSPATH

クラスパスが設定されたら、rmiregistryを実行します

rmiregistry &
2
Dylan R Coss

JDK1.6.0_33から1.7.0_45にアップグレードしたところ、同じ問題が発生しました。私はこのドキュメントを見つけ、rmiregistryを次のように開始することで問題を解決しました:

rmir​​egistry -Djava.rmi.server.useCodebaseOnly = false

以下を参照してください http://docs.Oracle.com/javase/7/docs/technotes/guides/rmi/enhancements-7.html

2
Munish Chandel

Rmir​​egistryが最初に開始されたcmdウィンドウを閉じます。新しいcmdで、プロジェクトクラスファイルが配置されている場所(binまで)に移動し、以下のコマンドを使用してレジストリを開始します。

rmir​​egistry -J-Djava.rmi.server.useCodebaseOnly = false

Eclipseを使用している場合は、ServerSideProjectを実行すると、実装クラスのインスタンスが指定されたURLにバインドされます。

バインディングメソッドの下に1行印刷して、印刷されるかどうかを確認します。正常に印刷された場合、サーバーは正常に動作しています。

2
Atul Patel

VM Arg:の最後に/ binを追加してみます。

-Djava.rmi.server.codebase=file:${workspace_loc}/progInternet2008/bin

実行するファイルはこのディレクトリにあるため、パスに含める必要があります。

2
howl

JDKをアンインストールして再インストールし、クラスパスと環境変数を変更するのに丸一日費やしました。しかし、犯人はコマンドstart rmigregistryが適切な方法でrmiregistryを開始しなかったことでした。したがって、このページのコメントに感謝して、解決策は一時的にCLASSPATHをunsetすることでした。そして、それはコマンドset CLASSPATH=

1
Abraham