【Error】Java RM相關錯誤:java.rmi.UnmarshalException: error unmarshalling arguments

運行codebase相關的Java RMI代碼時遇到了如下錯誤。

運行參數:

java \
-Djava.security.policy=jndi.policy \
-Djava.naming.provider.url=rmi://$ip:1099 \
-Djava.naming.factory.initial=com.sun.jndi.rmi.registry.RegistryContextFactory \
com.basics.RMI.DynamicCodeDownloading.MethodInterfaceServer

錯誤log:

Exception in thread "main" javax.naming.CommunicationException [Root exception is java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
	java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
	java.lang.ClassNotFoundException: com.basics.RMI.DynamicCodeDownloading.MethodInterface]
	at com.sun.jndi.rmi.registry.RegistryContext.rebind(RegistryContext.java:177)
	at com.sun.jndi.rmi.registry.RegistryContext.rebind(RegistryContext.java:182)
	at javax.naming.InitialContext.rebind(InitialContext.java:433)
	at com.basics.RMI.DynamicCodeDownloading.MethodInterfaceServer.main(MethodInterfaceServer.java:36)
Caused by: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
	java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
	java.lang.ClassNotFoundException: com.basics.RMI.DynamicCodeDownloading.MethodInterface
	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:283)
	at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:260)
	at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:375)
	at sun.rmi.registry.RegistryImpl_Stub.rebind(RegistryImpl_Stub.java:155)
	at com.sun.jndi.rmi.registry.RegistryContext.rebind(RegistryContext.java:175)
	... 3 more
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
	java.lang.ClassNotFoundException: com.basics.RMI.DynamicCodeDownloading.MethodInterface
	at sun.rmi.registry.RegistryImpl_Skel.dispatch(RegistryImpl_Skel.java:137)
	at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:468)
	at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:300)
	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: com.basics.RMI.DynamicCodeDownloading.MethodInterface
	at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.rmi.server.LoaderHandler$Loader.loadClass(LoaderHandler.java:1207)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	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:1800)
	at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1748)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2042)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1573)
	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:431)
	at sun.rmi.registry.RegistryImpl_Skel.dispatch(RegistryImpl_Skel.java:135)
	... 14 more

解決辦法:

rmiresigtry 1099 的運行目錄應該在 命令運行的目錄。此時,RMI Registry可以找到當前目錄下的class。

This one works because it puts the required class on the Registry's CLASSPATH, but only if that class isn't in a package. If it was, it wouldn't work. 

 

參考:

https://stackoverflow.com/questions/9531158/java-rmi-serverexception-remoteexception-occurred-in-server-thread-classnotfou

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章