Новичок в Java RMI испытывает затруднения, заставляя работать основное приложение hello world - PullRequest
0 голосов
/ 30 декабря 2011

Я написал простой класс реализации:

public interface MyRemote extends Remote {
    public String sayHello() throws RemoteException;
}

Затем класс удаленного сервера

public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote{

    protected MyRemoteImpl() throws RemoteException {

    }

    public String sayHello() throws RemoteException {
        return "Server says 'Hello World!'";
    }

    public static void main(String args[]) {
        try {
            MyRemote service = new MyRemoteImpl();
            Naming.rebind("RemoteHello", service);
        } catch (RemoteException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        } catch (MalformedURLException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
    }
}

Теперь я прочитал, что rmiregistry нужно запустить по тому же пути, где исходные классыявляются (и их заглушки), поэтому я просто скомпилировал с использованием intllij IDEA и автоматически сгенерировал классы заглушки, затем скопировал все классы в мой путь Java, который имеет файл rmiregistry.exe, а затем запустил rmiregistry (я знаю, что это должно быть довольно глупометод, но я просто пытался заставить его работать в качестве теста).Я все еще получаю сообщение об ошибке, как указано в нижней части этого поста, всякий раз, когда я пытаюсь скомпилировать файл сервера.

В книге, из которой я работаю, говорится, что для создания заглушек и скелетов я использую команду rmic из java, но я не могу 'я не могу найти этот файл (может быть, он из более старой версии JAVA?), поэтому я просто использую Intellij IDEA для создания заглушки ... но файл скелета не создается.

Я уверен, что тамВ RMI есть несколько вещей, которые я не понимаю, но я просмотрел некоторые учебники в Интернете и не могу понять, что это такое, подумал, может быть, кто-то из stackoverflow может указать мне правильное направление.Любая помощь будет принята с благодарностью.

java.rmi.ServerError: Произошла ошибка в потоке сервера;Вложенное исключение: java.lang.UnsupportedClassVersionError: MyRemote: неподдерживаемая версия major.minor 51.0 в sun.rmi.server.UnicastServerRef.oldDispatch (неизвестный источник) в sun.rmi.server.UnicastServerRef.dispatch (неизвестный источник) в Sun..transport.Transport $ 1.run (неизвестный источник) в java.security.AccessController.doPrivileged (собственный метод) в sun.rmi.transport.Transport.serviceCall (неизвестный источник) в sun.rmi.transport.tcp.TCPTransport.handleMessages (Неизвестный источник) в sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run0 (неизвестный источник) в sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run (неизвестный источник) в java.util.concurrent.ThreadPoolExecutor $ Worker.runTask (неизвестный источник) в java.util.concurrent.ThreadPoolExecutor $ Worker.run (неизвестный источник) в java.lang.Thread.run (неизвестный источник) в sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer (StreamRemoteCall.java:в sun.rmi.transport.StreamRemoteCall.executeCall (StreamRemoteCall.java:251) в sun.rmi.server.UnicastRef.invoke (UnicastRef.java:377) в sun.rmi.registry.RegistryImpl_Stub.rebind (неизвестный источник) в java.rmi.Naming.rebind (Naming.java:177) в MyRemoteImpl.main (MyRemoteImpl.java:27)at sun.reflect.NativeMethodAccessorImpl.invoke0 (родной метод) в sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:57) в sun.reflect.DelegatingMethodAccessorImpl.intaf.jho.jj.invoke (Method.java:601) на com.intellij.rt.execution.application.AppMain.main (AppMain.java:120)

Ответы [ 3 ]

3 голосов
/ 29 июля 2012

Я столкнулся с той же проблемой и провел довольно много времени, пытаясь выяснить, что пошло не так.Тот же UnsupportedClassVersionError был выдан из потока сервера, он озадачил меня, почему исключение было выдано в строке naming.rebind ().И реализация, и интерфейс моего RMI компилируются с использованием того же компилятора и настроек, что и приложение сервера.

Оказывается, что версия rmiregistry, которую я использовал, имеет более низкую версию (1.6), чем компиляция моегобанки (1,7).Я даже не знаю, как / почему исключение было сгенерировано в потоке сервера вместо того, чтобы отображаться в терминале, который запускает rmiregistry.

Вывод: если вы запускаете rmiregistry из терминала, наберите "man rmiregistry", чтобы понятьЧтобы узнать, для какой версии предназначен ваш rmiregistry по умолчанию, убедитесь, что класс, включенный в путь к классу rmiregistry, скомпилирован в той же версии.

3 голосов
/ 16 февраля 2013

1) Создать заглушки

After compiling we have two classes:

    d:\htdocs\java\NetBeansProjects\RMIserver\build\classes\rmi\

        MyRemote.class
        MyRemoteImpl.class
Run rmic

    rmic -classpath d:\htdocs\java\NetBeansProjects\RMIserver\build\classes\  
                 -d d:\htdocs\java\NetBeansProjects\RMIserver\build\classes\rmi\ 
                    rmi.MyRemoteImpl

The rmic tool creates a new class:

    /build/classes/rmi/rmi/MyRemoteImpl_Stub.class

2) Запустить магистр

Be sure you start it from a directory that has access to your classes.

    cd d:\htdocs\java\NetBeansProjects\RMIserver\build\classes\

    %rmiregistry

5) Запустить службу (команда или IDE)

%java MyRemoteImpl
2 голосов
/ 30 декабря 2011

Ошибка в основном означает, что вы скомпилировали классы в более высокой версии Java, чем на них.Убедитесь, что вы используете ту же версию JRE, или убедитесь, что вы компилируете их с версией, на которой вы хотите их запустить (используя -target параметр javac)

Чтение эта статья для более подробной информации.

...