RMI - запуск кода клиента на Eclipse создает исключение MarshalException, в то время как выполнение с консоли работает нормально - PullRequest
0 голосов
/ 05 октября 2010

Я написал простой код RMI, чтобы узнать, как он работает. Несмотря на то, что все прекрасно работает, компиляция java-кода, rmic it, запуск rmiregistry и запуск клиентского кода из консоли работает нормально, но когда я выбираю «запускать как Java-приложение» на клиентском коде из Eclipse, он вызывает исключение MarshallException.

Я предполагаю, что Eclipse компилируется с другой версией в соответствии с:

java.rmi.MarshalException

Я проверил настройку компилятора Eclipseи это говорит 1.6.(щелкните правой кнопкой мыши на Project Explorer и выберите «фасеты проекта», после чего вы увидите, какую версию 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 Ответ

1 голос
/ 05 октября 2010

Рассматриваемая версия - это не версия JRE, а версия вызываемых классов. Это означает, что ваш клиент вызывает другой набор jar-файлов в eclipse. В общем, если eclipse и консоль дают разные результаты, это почти всегда проблема с classpath.

Проверьте раздел «Java Build Path» вашего проекта и все связанные с ним проекты, чтобы убедиться, что все совпадает. Следите за флягой, у которой есть com.masatosan.remote.server.MyRemoteServer, я считаю, что это та, которая имеет проблему с версией Баночка, на которую указывает затмение, может быть другой и / или несвежей. Вот несколько мест для проверки в разделе пути сборки вашего проекта

1) Убедитесь, что вы правильно используете вкладку «проекты».

2) Убедитесь, что все файлы jar на вкладке «библиотеки» такие же, как при компиляции на консоли

3) Убедитесь, что ни одна из фляг, которые должны быть включены на вкладке «проекты», не находится на вкладке «библиотеки». Я видел, как многие люди теряют свои волосы, потому что Eclipse использует jar-файлы, которые обновляются только в том случае, если они скомпилированы из командной строки.

4) Поиграйте с вкладкой «Заказ и экспорт». Если что-то выше чего-то другого, оно загружается первым. Версия, которая загружается первой, является версией, которая используется. Если ваше приложение командной строки и проект eclipse имеют одинаковые jar-файлы, но включают их в другом порядке, у вас могут возникнуть эти проблемы.

5) Некоторые банки можно установить непосредственно в JRE, включив их в каталог JRE. Это крайне маловероятно, но вы можете проверить, используется ли затмение JRE, и убедиться, что оно такое же, как у консоли.

Удачи, проблемы с классами очень сложны.

...