簡體   English   中英

*添加*文件會在RMI服務器中導致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程序的代碼庫的標志來完成相同的操作。 有人知道語法嗎? 我嘗試了這些(失敗):

rmir​​egistry -JCLASSPATH =“ path / to / classes /”
rmir​​egistry -JCLASSPATH =“ / absolute / path / to / classes /”
rmir​​egistry -J-DCLASSPATH =“ path / to / classes /”
rmir​​egistry -J-DCLASSPATH =“ / absolute / path / to / classes /”

當服務器開始運行時,它們都會導致java.lang.ClassNotFoundException: BNS.plumbing.SessionHostInterface (至少這是新的行為。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM