我知道这个问题是多余的,但是堆栈溢出中的先前答案都没有:(解决了我的问题。我创建了一个简单的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;
};
但是仍然面临相同的错误,我们将提供任何帮助.....