*添加*文件会导致RMI服务器中出现java.lang.ClassNotFoundException

时间:2013-10-26 03:10:21

标签: java rmi classnotfoundexception stub

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

WTF ?? 当它失踪时,它并没有抱怨Hello_Stub丢失;但是当我添加该文件时,它开始抱怨它不在那里。 HUH?

以下是终端的成绩单。首先你看到一个错误;然后我列出当前目录中的文件;然后我生成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也许吧?我看不出要找什么。任何狂野的理论?

2 个答案:

答案 0 :(得分:0)

不要添加存根。从Java 1.5开始你就不需要了。只需确保遵循Javadoc前言中列出的要求UnicastRemoteObject.原始问题是由CLASSPATH上的远程接口类无法提供给注册表或客户端,或两者兼而有之。

答案 1 :(得分:0)

我已经开始了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 当服务器开始运行时。 (这至少是新的行为。)