【问题标题】:Java RMI newbie having trouble getting a basic hello world app to workJava RMI 新手无法让基本的 hello world 应用程序正常工作
【发布时间】:2011-12-29 23:52:01
【问题描述】:

我写了一个简单的实现类:

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(我知道这一定是一个非常愚蠢的方法,但我只是想让它作为测试工作)。每当我尝试编译服务器文件时,仍然会收到本文底部列出的错误。

我正在使用的书说使用 java 的 rmic 命令来生成存根和骨架,但我找不到这个文件(也许它来自旧版本的 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.rmi.transport.Transport$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) 在 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(Unknown Source) 在 sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:273) 在 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) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:601) 在 com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

【问题讨论】:

    标签: java rmi


    【解决方案1】:

    我遇到了同样的问题,并花了很长时间试图找出问题所在。从服务器线程抛出了相同的 UnsupportedClassVersionError ,这让我对为什么在naming.rebind() 行抛出异常感到困惑。我的 RMI 的实现和接口都使用与服务器应用程序相同的编译器和设置进行编译。

    事实证明,我使用的 rmiregistry 版本 (1.6) 比我的 jar 编译 (1.7) 的版本低。我什至不知道异常是如何/为什么在服务器线程中引发的,而不是显示在运行 rmiregistry 的终端上。

    结论:如果您从终端运行 rmiregistry,请键入“man rmiregistry”以找出您的默认 rmiregistry 的版本,确保 rmiregistry 的类路径中包含的类在同一版本中编译。

    【讨论】:

    • 不确定最后一条指令是什么意思,但在 Ubuntu 上使用sudo update-alternatives --config rmiregistry时请确保选择了正确的版本
    【解决方案2】:

    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) 启动 rmiregistry

    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
    

    【讨论】:

      【解决方案3】:

      该错误基本上意味着您使用的 Java 版本比运行它们的版本更高。确保您运行的是相同的 JRE 版本,或者确保根据您想要运行它们的版本编译它们(使用 javac-target 选项)

      阅读this article了解更多详情。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多