在两台机器之间运行 Java RMI 时出现问题

问题描述

我有两台机器(操作系统 - Ubuntu18.04)。 JVM(Java 版本“1.8.0_66”)正在两台机器上运行,我想使用 rmi 从 machine1 调用在 machine2 上运行的 api。 我关注的链接是 - https://docs.oracle.com/javase/7/docs/technotes/guides/rmi/hello/hello-world.html#4

但是我在运行服务器代码时遇到以下错误

java.rmi.ServerException: remoteexception occurred in server thread; nested exception is: 
   java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
   java.lang.classNotFoundException: example.hello.Hello
   at sun.rmi.server.UnicastServerRef.olddispatch(UnicastServerRef.java:420)
   at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:268)
   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:568)
   at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
   at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$95(TCPTransport.java:683)
   at java.security.AccessController.doPrivileged(Native Method)
   at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
   at java.lang.Thread.run(Thread.java:745)
   at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:276)
   at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:253)
   at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:379)
   at sun.rmi.registry.RegistryImpl_Stub.bind(UnkNown Source)
   at example.hello.Server.main(Server.java:23)

Caused by: java.rmi.UnmarshalException: error unmarshalling arguments;嵌套异常是:

java.lang.classNotFoundException: example.hello.Hello
       at sun.rmi.registry.RegistryImpl_Skel.dispatch(UnkNown Source)
at sun.rmi.server.UnicastServerRef.olddispatch(UnicastServerRef.java:410)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:268)
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:568)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$95(TCPTransport.java:683)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

引起:java.lang.classNotFoundException:example.hello.Hello

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:255)
at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1559)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1515)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774)
at java.io.ObjectInputStream.readobject0(ObjectInputStream.java:1351)
at java.io.ObjectInputStream.readobject(ObjectInputStream.java:371)

我已经完成了以下步骤。

  1. mkdir 'destDir'。
  2. javac -d destDir Hello.java Server.java Client.java
  3. rmiregistry &
  4. cd destDir
  5. java -classpath /home/test/Desktop/rmi/destDir -Djava.rmi.server.codebase=file:/home/test/Desktop/rmi/destDir/example.hello.Server

但是得到了如上的错误

尽量说得更清楚,我在这个问题上缺乏想法,即使它听起来很经典:我花了几个小时试图解决这个问题,但一无所获。有人可以帮我找到丢失的部分吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)