[英]RMI Remote Exception : java.lang.ClassNotFoundException
[英]*adding* a file causes java.lang.ClassNotFoundException in RMI server
我正在嘗試建立一個曾經可以使用的RMI應用程序,但是現在我的行為越來越怪異。 當我在沒有存根的情況下運行它時,我得到java.lang.ClassNotFoundException:HelloInterface然后將新文件(Hello_Stub)添加到目錄中(通過使用rmic),然后得到java.lang.ClassNotFoundException:Hello_Stub
WTF ?? 它並沒有抱怨Hello_Stub丟失了; 但是當我添加該文件時,它開始抱怨它不存在。 ?
以下是終端的成績單。 首先,您會看到一個錯誤; 然后我列出當前目錄中的文件; 然后我生成存根文件並向您顯示; 然后您會看到錯誤消息,其中抱怨剛添加的文件丟失:
sjudd@kearnsgroup:/kearnsgroup/www/RMItest/classes> java HelloServer
initializing Hello class: Hello, world!
Hello Server failed: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: HelloInterface
sjudd@kearnsgroup:/kearnsgroup/www/RMItest/classes> ll
total 32
-rw------- 1 sjudd sjudd 765 Oct 25 19:52 Hello.class
-rw------- 1 sjudd sjudd 967 Oct 25 19:52 HelloClient.class
-rw-r----- 1 sjudd sjudd 614 Oct 25 19:42 HelloClient.java
-rw------- 1 sjudd sjudd 222 Oct 25 19:52 HelloInterface.class
-rw-r----- 1 sjudd sjudd 360 Oct 25 09:08 HelloInterface.java
-rw-r----- 1 sjudd sjudd 847 Oct 25 09:56 Hello.java
-rw------- 1 sjudd sjudd 916 Oct 25 19:52 HelloServer.class
-rw-r----- 1 sjudd sjudd 439 Oct 25 09:14 HelloServer.java
sjudd@kearnsgroup:/kearnsgroup/www/RMItest/classes> rmic Hello
sjudd@kearnsgroup:/kearnsgroup/www/RMItest/classes> ll
total 36
-rw------- 1 sjudd sjudd 765 Oct 25 19:52 Hello.class
-rw------- 1 sjudd sjudd 967 Oct 25 19:52 HelloClient.class
-rw-r----- 1 sjudd sjudd 614 Oct 25 19:42 HelloClient.java
-rw------- 1 sjudd sjudd 222 Oct 25 19:52 HelloInterface.class
-rw-r----- 1 sjudd sjudd 360 Oct 25 09:08 HelloInterface.java
-rw-r----- 1 sjudd sjudd 847 Oct 25 09:56 Hello.java
-rw------- 1 sjudd sjudd 916 Oct 25 19:52 HelloServer.class
-rw-r----- 1 sjudd sjudd 439 Oct 25 09:14 HelloServer.java
-rw------- 1 sjudd sjudd 1635 Oct 25 20:34 Hello_Stub.class
sjudd@kearnsgroup:/kearnsgroup/www/RMItest/classes> java HelloServer
initializing Hello class: Hello, world!
Hello Server failed: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: Hello_Stub
請注意,這里失敗的是rmi SERVER,而不是客戶端。
該代碼可以在一台計算機(Mac)上正常運行,但是當復制到另一台計算機(Linux)上時,則會引發此驚人的錯誤。
我被這種怪異感震驚,不知道該如何處理。 這可能與解組步驟有關嗎? 還是環境變量? 也許是CLASSPATH? 我看不到要尋找的東西。 有荒誕的理論嗎?
不要添加存根。 從Java 1.5開始,您就不需要一個。 只要確保您遵循UnicastRemoteObject.
的Javadoc序言中概述的要求即可UnicastRemoteObject.
最初的問題是由CLASSPATH上的注冊表或客戶端(或兩者)無法使用遠程接口類引起的。
我在開始rmiregistry時並未關注其上課道路。 通過CD到classes目錄並在此處啟動,所有問題都消失了。
我相信您可以使用指定CLASSPATH或rmiregistry程序的代碼庫的標志來完成相同的操作。 有人知道語法嗎? 我嘗試了這些(失敗):
rmiregistry -JCLASSPATH =“ path / to / classes /”
rmiregistry -JCLASSPATH =“ / absolute / path / to / classes /”
rmiregistry -J-DCLASSPATH =“ path / to / classes /”
rmiregistry -J-DCLASSPATH =“ / absolute / path / to / classes /”
當服務器開始運行時,它們都會導致java.lang.ClassNotFoundException: BNS.plumbing.SessionHostInterface
。 (至少這是新的行為。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.