0

我正在尝试设置一个曾经有效但现在出现奇怪行为的 RMI 应用程序。当我在没有存根的情况下运行它时,我得到 java.lang.ClassNotFoundException: HelloInterface 然后我将一个新文件 (Hello_Stub) 添加到目录中(通过使用 rmic),然后我得到 java.lang.ClassNotFoundException: Hello_Stub

怎么回事??当它丢失时,它并没有抱怨 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)时,它会抛出这个惊人的错误。

我被这种奇怪的感觉吓坏了,我不知道如何处理它。这可能与解组步骤有关吗?还是使用环境变量?也许是类路径?我看不出要寻找什么。有什么疯狂的理论吗?

4

2 回答 2

0

不要添加存根。从 Java 1.5 开始就不需要了。只需确保您遵循 Javadoc 序言中概述的要求,UnicastRemoteObject.原始问题是由于远程接口类在注册表或客户端的 CLASSPATH 上不可用,或两者兼而有之。

于 2013-10-27T22:11:06.700 回答
0

我开始 rmiregistry 时没有注意它的类路径。通过 cd'ing 到 classes 目录并从那里启动它,所有问题都消失了。

我相信您可以使用为 rmiregistry 程序指定 CLASSPATH 或代码库的标志来完成同样的事情。有谁知道语法?我已经尝试了这些(不成功):

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 服务器开始运行。(至少这是一种新行为。)

于 2013-10-31T01:33:07.293 回答