Java RMI ServerException - java.lang.ClassNotFoundException: org.prog.rmi.RmiServer_Stub

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/7178137/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 18:58:08  来源:igfitidea点击:

Java RMI ServerException - java.lang.ClassNotFoundException: org.prog.rmi.RmiServer_Stub

javarmi

提问by Loftx

I have inherited some Java RMI client/server code, and while it runs fine on one machine, I haven't been able to get it to run in my dev environment.

我继承了一些 Java RMI 客户端/服务器代码,虽然它在一台机器上运行良好,但我无法让它在我的开发环境中运行。

The problem is when I run the server using the following java.exe -Djava.security.policy=conf\server.policy -SRC;. -Djava.library.path=. org.prog.rmi.RmiServer

问题是当我使用以下命令运行服务器时 java.exe -Djava.security.policy=conf\server.policy -SRC;. -Djava.library.path=. org.prog.rmi.RmiServer

I get the following error:

我收到以下错误:

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
java.lang.ClassNotFoundException: org.prog.rmi.RmiServer_Stub (no security manager: RMI class loader disabled)
    at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:396)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250)
    at sun.rmi.transport.Transport.run(Transport.java:159)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
    ...

My server.policyfile is

我的server.policy文件是

grant {
    permission java.security.AllPermission;
};

And my java code:

还有我的java代码:

        package org.prog.rmi;

        import java.rmi.Naming;
        import java.rmi.RemoteException;
        import java.rmi.RMISecurityManager;
        import java.rmi.server.UnicastRemoteObject;
        import java.rmi.registry.*; 

        public class RmiServer extends UnicastRemoteObject 
            implements RmiServerIntf {

        private BatchApi bapi;
        private String iniFileLocation;
        private String layoutOption;
        private int addressCount = 0;
        private RefInt apiHandle = new RefInt();


        public RmiServer(String iniFileLocation,String layoutOption) throws RemoteException 
        {   super();
            this.iniFileLocation = iniFileLocation;
            this.layoutOption = layoutOption;
            initAPI();
            startupAPI();
            openAPI();      
        }

        public static void main(String args[]) 
        {
            System.out.println("RMI server started");

            // Create and install a security manager
            if (System.getSecurityManager() == null) 
            {
                System.setSecurityManager(new RMISecurityManager());
                System.out.println("Security manager installed.");
            }
            else
                System.out.println("Security manager already exists.");

            try  //special exception handler for registry creation
            {
                LocateRegistry.createRegistry(1099); 
                System.out.println("java RMI registry created.");
            }
            catch (RemoteException e)
            {
                //do nothing, error means registry already exists
                System.out.println("java RMI registry already exists.");
            }

            try
            {
                //Instantiate RmiServer
                for (String arg: args){
                    System.out.println(arg);
                }

                RmiServer obj = new RmiServer(args[0],args[1]);

                // Bind this object instance to the name "RmiServer"
                Naming.rebind("//127.0.0.1/RmiServer", obj);
                System.out.println("PeerServer bound in registry");

            } 
            catch (Exception e) 
            {
                System.err.println("RMI server exception:");
                e.printStackTrace();
            }
        }    
}

I've seen solutions relating to the java.rmi.server.codebasebut didn't have any luck setting this either

我已经看到了有关的解决方案,java.rmi.server.codebase但也没有任何运气设置

采纳答案by Loftx

After some further investigation and following RMI tutorials it appeared that there was a problem with the RMI registration server on port 1099.

经过一些进一步的调查和遵循 RMI 教程后,端口 1099 上的 RMI 注册服务器似乎存在问题。

When I stared the RMI registration server on another port (e.g. 2005) and changed these lines of code

当我在另一个端口(例如 2005)上启动 RMI 注册服务器并更改这些代码行时

LocateRegistry.createRegistry(2005);

and

Naming.rebind("//127.0.0.1:2055/RmiServer", obj);

This ran sucessfully without errors and my client was able to connect.

这运行成功,没有错误,我的客户端能够连接。

I hope this answer helps others with this error. Let me know if anyone needs any more detailed information.

我希望这个答案可以帮助其他人解决这个错误。如果有人需要更详细的信息,请告诉我。

回答by user207421

You haven't regenerated the stub with rmic, or the Registry doesn't have access to it via its classpath.

您尚未使用rmic重新生成存根,或者注册表无法通过其类路径访问它。