找不到Java RMI类

我知道这个问题是多余的,但是堆栈溢出中的先前答案都没有:(解决了我的问题。我创建了一个简单的Java RMI程序,但是面对classnotFoundException,我正在提供示例代码。

import java.rmi.RemoteException;
import java.util.*;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.Naming;
interface OperationsInterface extends Remote
{
 String addParticipant(String name) throws RemoteException;
}
class MetaData extends UnicastRemoteObject implements OperationsInterface
{
 int count;
 List<String> names;

 MetaData() throws RemoteException
 {
   names = new ArrayList<String>();
 }

 public String addParticipant(String name)
 {
   this.count++;
   this.names.add(name);
   return "Successfully added";
 }
}
public class MyServer
{
 public static void main(String ar[])
 {
   try
   {
     MetaData metaData = new MetaData();
     //Registry registry = LocateRegistry.getRegistry();
     //registry.rebind("Game",metaData);
     Naming.rebind("rmi:///Game",metaData);
     System.out.println("Server Started ....");
   }catch(Exception e){
     System.out.println(e);
     e.printStackTrace();
   }
 }
}

我正在使用Macbook pro。

我将Java程序编译为:

javac MyServer.java

然后,我以以下方式启动注册表服务器:

rmiregistry

我以以下方式启动程序:

java MyServer

但是会引发以下错误:

    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
    java.lang.ClassnotFoundException: OperationsInterface
java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
    java.lang.ClassnotFoundException: OperationsInterface
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:389)
    at sun.rmi.transport.Transport$1.run(Transport.java:200)
    at sun.rmi.transport.Transport$1.run(Transport.java:197)
    at java.security.accessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:573)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:834)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:688)
    at java.security.accessController.doPrivileged(Native Method)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:303)
    at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:279)
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:379)
    at sun.rmi.registry.RegistryImpl_Stub.rebind(RegistryImpl_Stub.java:158)
    at java.rmi.Naming.rebind(Naming.java:177)
    at MyServer.main(MyServer.java:37)
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
    java.lang.ClassnotFoundException: OperationsInterface
    at sun.rmi.registry.RegistryImpl_Skel.dispatch(RegistryImpl_Skel.java:157)
    at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:469)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:301)
    at sun.rmi.transport.Transport$1.run(Transport.java:200)
    at sun.rmi.transport.Transport$1.run(Transport.java:197)
    at java.security.accessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:573)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:834)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:688)
    at java.security.accessController.doPrivileged(Native Method)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassnotFoundException: OperationsInterface
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
    at sun.rmi.server.LoaderHandler$Loader.loadClass(LoaderHandler.java:1207)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at sun.rmi.server.LoaderHandler.loadClassForName(LoaderHandler.java:1221)
    at sun.rmi.server.LoaderHandler.loadProxyInterfaces(LoaderHandler.java:731)
    at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:674)
    at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:611)
    at java.rmi.server.rmiclassLoader$2.loadProxyClass(rmiclassLoader.java:646)
    at java.rmi.server.rmiclassLoader.loadProxyClass(rmiclassLoader.java:311)
    at sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:265)
    at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1856)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1804)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2098)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1624)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:464)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:422)
    at sun.rmi.registry.RegistryImpl_Skel.dispatch(RegistryImpl_Skel.java:154)
    ... 14 more

数小时的堆栈溢出后,我将启动Java程序的方式更改为:

java -Djava.rmi.server.codebase=file:/Users/RMI/dummy/  -Djava.security.policy=/Users/RMI/security.policy MyServer

其中MyServer.java在伪目录中,而security.policy文件的内容由给出:

grant {
    // Allow everything for now
    permission java.security.AllPermission;
};

但是仍然面临相同的错误,我们将提供任何帮助.....

iCMS 回答:找不到Java RMI类

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/1751684.html

大家都在问