eclipse上的JAVA RMI问题

问题描述 投票:0回答:1

我试图在我的 Eclipse 上运行一个简单的 Java RMI,但每次我都会遇到不同的错误。如果我通过 CMD 运行我的源代码(我在 Windows 上),它可以工作,但我更喜欢在 Eclipse 上运行我的代码,因为它更舒服!

这是代码:

界面

package rmiproject;

import java.rmi.*;

public interface HelloIn extends Remote {

    public String ciao(String name) throws RemoteException;
}

服务器

package rmiproject;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class Server extends UnicastRemoteObject implements HelloIn {

    protected Server() throws RemoteException {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * 
     */
    @Override
    public String ciao(String name) throws RemoteException {
        // TODO Auto-generated method stub
        String output= "Server dice ciao "+name;
        return output;
    }

    private static final long serialVersionUID = 1L;

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.setProperty("java.rmi.server.hostname","myipaddress");
        try {
            Naming.rebind("//localhost/Server", new Server());
        } catch (RemoteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

客户

package rmiproject;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

public class Client {
    private static HelloIn lookup;

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            lookup= (HelloIn) Naming.lookup("//localhost/Server");
            String s= lookup.ciao("peppe");
            System.out.println(s);
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (RemoteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NotBoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

这是我在 Eclipse 上运行时遇到的错误:

Exception in thread "main" java.lang.reflect.InaccessibleObjectException: Unable to make public abstract java.lang.String rmiproject.HelloIn.ciao(java.lang.String) throws java.rmi.RemoteException accessible: module Rmi does not "exports rmiproject" to module java.rmi
    at java.base/java.lang.reflect.AccessibleObject.throwInaccessibleObjectException(AccessibleObject.java:391)
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:367)
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:315)
    at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:203)
    at java.base/java.lang.reflect.Method.setAccessible(Method.java:197)
    at java.rmi/sun.rmi.server.UnicastServerRef$HashToMethod_Maps$1.run(UnicastServerRef.java:598)
    at java.rmi/sun.rmi.server.UnicastServerRef$HashToMethod_Maps$1.run(UnicastServerRef.java:596)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:319)
    at java.rmi/sun.rmi.server.UnicastServerRef$HashToMethod_Maps.computeValue(UnicastServerRef.java:595)
    at java.rmi/sun.rmi.server.UnicastServerRef$HashToMethod_Maps.computeValue(UnicastServerRef.java:574)
    at java.rmi/sun.rmi.server.WeakClassHashMap.get(WeakClassHashMap.java:74)
    at java.rmi/sun.rmi.server.UnicastServerRef.exportObject(UnicastServerRef.java:236)
    at java.rmi/java.rmi.server.UnicastRemoteObject.exportObject(UnicastRemoteObject.java:473)
    at java.rmi/java.rmi.server.UnicastRemoteObject.exportObject(UnicastRemoteObject.java:358)
    at java.rmi/java.rmi.server.UnicastRemoteObject.<init>(UnicastRemoteObject.java:230)
    at java.rmi/java.rmi.server.UnicastRemoteObject.<init>(UnicastRemoteObject.java:212)
    at Rmi/rmiproject.Server.<init>(Server.java:10)
    at Rmi/rmiproject.Server.main(Server.java:29)

当我在 CMD 上运行它时,我遵循以下步骤:

  • 首先,我为 JDK 设置路径,然后启动 rmiregistry
  • 然后我打开另外两个窗口,启动服务器,然后启动客户端。
javac rmiproject/Server.java
java rmiproject.Server

对于不同窗口上的客户端也是如此。

java eclipse server rmi
1个回答
0
投票

以这种方式修复:

  • 将导出 rmiproject(包的名称)添加到 module-info.java
  • 从 cmd 启动 rmiregistry(在你的 src 路径中)
© www.soinside.com 2019 - 2024. All rights reserved.