代码之家  ›  专栏  ›  技术社区  ›  MrAlex

eclipse上的JAVA RMI问题

  •  0
  • MrAlex  · 技术社区  · 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设置了一条路径,然后开始 rmi注册表 .
    • 然后我打开另外两个窗口,启动服务器,然后启动客户端。
    javac rmiproject/Server.java
    java rmiproject.Server
    

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

    0 回复  |  直到 1 年前
        1
  •  0
  •   MrAlex    1 年前

    以这种方式修复:

    • 已添加将rmiproject(包的名称)导出到module-info.java
    • 从cmd启动rmiregistry(在src路径中)
        2
  •  0
  •   Mirjana Mirjana    1 年前
    // add this in module-info.java
    module NameOfTheJavaProject {
        exports nameOfThePackage; // package where classes use java.rmi
        requires java.rmi;
    }
    

    它对我奏效了