【问题标题】:RMI - run client code on Eclipse throws MarshalException while execute from console works fineRMI - 在 Eclipse 上运行客户端代码抛出 MarshalException 而从控制台执行工作正常
【发布时间】:2010-10-05 02:58:08
【问题描述】:

我编写了简单的 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;
}

【问题讨论】:

    标签: java eclipse version compilation rmi


    【解决方案1】:

    有问题的版本不是 JRE 的版本,而是被调用的类的版本。这意味着您的客户在 Eclipse 中调用了一组不同的 jar。一般来说,如果 eclipse 和控制台给出不同的结果,那几乎总是一个类路径问题。

    检查项目的“Java 构建路径”部分以及所有相关项目,以确保一切匹配。留意有 'com.masatosan.remote.server.MyRemoteServer' 的 jar,我相信这是有版本问题的那个。日食指向的罐子可能不同和/或陈旧。这里有一些地方可以检查你的项目的构建路径部分

    1)确保您正确使用“项目”选项卡。

    2)检查以确保“库”选项卡上的所有 jar 都与在控制台上编译时相同

    3) 确保“项目”选项卡中不应包含的任何 jar 文件都位于“库”选项卡中。我见过很多人因为 eclipse 使用的 jar 文件只有在从命令行编译时才会更新。

    4) 使用“订购和导出”标签。如果某些东西高于其他东西,它会首先加载。首先加载的版本是使用的版本。如果您的命令行应用程序和 eclipse 项目都具有相同的 jar,但以不同的顺序包含它们,您可能会遇到这些问题。

    5) 一些 jars 可以直接安装到 JRE 中,方法是将它们包含在 JREs 目录中。这不太可能,但您可以检查 JRE eclipse 正在使用并确保它与控制台相同。

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

    【讨论】:

      猜你喜欢
      • 2012-12-03
      • 2013-06-02
      • 1970-01-01
      • 2020-12-11
      • 2020-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-19
      相关资源
      最近更新 更多