我正在尝试设置一个曾经有效的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也许吧?我看不出要找什么。任何狂野的理论?
答案 0 :(得分:0)
不要添加存根。从Java 1.5开始你就不需要了。只需确保遵循Javadoc前言中列出的要求UnicastRemoteObject.
原始问题是由CLASSPATH上的远程接口类无法提供给注册表或客户端,或两者兼而有之。
答案 1 :(得分:0)
我已经开始了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
当服务器开始运行时。 (这至少是新的行为。)