我编写了简单的RMI代码来了解它是如何工作的。 虽然一切正常编译java代码,rmic它并运行rmiregistry并从控制台运行客户端代码工作正常但是当我选择在Eclipse的客户端代码上“作为Java应用程序运行”时,它会抛出MarshallException。
我的猜测是Eclipse正在编译不同的版本根据:
我已经检查了Eclipse编译器设置,它说1.6
。
(右键单击Project Explorer并选择“project facets”,然后您将看到Eclipse编译java文件的版本)
我的Java是1.6
所以无论从控制台和Eclipse编译代码如何,都应该生成1.6
版本编译的类文件。 (javap -verbose | grep -i version
会显示版本50
,相当于1.6
)
有没有人遇到同样的问题并对此有解释?
可能没有必要,但工作代码如下。
客户代码
package com.masatosan.remote.client;
import java.rmi.Naming;
import java.rmi.RemoteException;
import com.masatosan.remote.server.MyRemoteServer;
public class MyRemoteClient {
public static void main(String[] args) {
new MyRemoteClient().go();
}
public void go() {
try {
MyRemoteServer service = (MyRemoteServer) Naming.lookup("rmi://127.0.0.1/MyFirstRemoteService");
String s = service.sayHello();
System.out.println(s);
}
catch(Exception ex) {
ex.printStackTrace();
}
}
}
服务器代码
package com.masatosan.remote.server;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class MyRemoteServerImp extends UnicastRemoteObject implements MyRemoteServer {
public static void main(String[] args) {
try {
MyRemoteServer service = new MyRemoteServerImp();
Naming.rebind("MyFirstRemoteService", service);
}
catch(Exception ex) {
ex.printStackTrace();
}
}
public MyRemoteServerImp() throws RemoteException {}
@Override
public String sayHello() throws RemoteException {
return "Hi I'm server!";
}
}//
存根的服务器代码接口
package com.masatosan.remote.server;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface MyRemoteServer extends Remote {
public String sayHello() throws RemoteException;
}
答案 0 :(得分:1)
有问题的版本不是JRE的版本,而是要调用的类的版本。这意味着您的客户在eclipse中调用了一组不同的jar。一般来说,如果eclipse和控制台提供不同的结果,它几乎总是一个类路径问题。
检查项目的“Java Build Path”部分以及与之相关的所有项目,确保一切都匹配。请关注具有'com.masatosan.remote.server.MyRemoteServer'的jar,我相信这是一个有版本问题的jar。日食指向的罐子可能不同和/或陈旧。以下是一些要检查项目的构建路径部分的地方
1)确保正确使用“项目”标签。
2)检查以确保'libraries'选项卡上的所有jar都与在控制台上编译时相同
3)确保“项目”选项卡中应包含的任何罐都不在“库”选项卡中。我见过很多人去掉他们的头发,因为eclipse使用的jar只有在从命令行编译时才更新。
4)使用“订购和导出”标签进行游戏。如果某些东西高于其他东西,它会首先加载。首先加载的版本是使用的版本。如果您的命令行应用程序和eclipse项目具有相同的jar,但是以不同的顺序包含它们,则可能会出现这些问题。
5)通过将JAR包含在JREs目录中,可以直接将一些jar安装到JRE中。这是极不可能的,但您可以检查JRE eclipse正在使用并确保它与控制台相同。
祝你好运,类路径问题非常棘手。