RMI - 在Eclipse上运行客户端代码会抛出MarshalException,而从控制台执行则可以正常工作

时间:2010-10-05 02:58:08

标签: java eclipse version compilation rmi

我编写了简单的RMI代码来了解它是如何工作的。 虽然一切正常编译java代码,rmic它并运行rmiregistry并从控制台运行客户端代码工作正常但是当我选择在Eclipse的客户端代码上“作为Java应用程序运行”时,它会抛出MarshallException。

我的猜测是Eclipse正在编译不同的版本根据:

java.rmi.MarshalException

我已经检查了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;
}

1 个答案:

答案 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正在使用并确保它与控制台相同。

祝你好运,类路径问题非常棘手。