当前位置: 首页 > 知识库问答 >
问题:

Java RMI代码库不工作

宋华美
2023-03-14

据我所知,我在客户机上设置的RMI代码库将传递给服务器。然后,服务器使用此代码库定位不在服务器类路径中的类。

只要所有必需的类在服务器类路径中可用,远程方法调用就可以正常工作。然后,我尝试从服务器类路径中删除一个必需的类,并在启动RMI客户端时在代码库属性中为必需的类指定新位置。不幸的是,这将给我一个ClassNotFoundExc0019:java.lang.ClassNotFoundExc0019:客户端。圆周率

堆栈跟踪:

java.rmi.ServerException: RemoteException occurred in server thread; nested exce
ption is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested excep
tion is:
java.lang.ClassNotFoundException: client.Pi
at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
at sun.rmi.transport.Transport$1.run(Unknown Source)
at sun.rmi.transport.Transport$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Sou
rce)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Sour
ce)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknow
n Source)
at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source)
at sun.rmi.server.UnicastRef.invoke(Unknown Source)
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unkn
own Source)
at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source)
at com.sun.proxy.$Proxy0.executeTask(Unknown Source)
at client.ComputePi.main(ComputePi.java:26)
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested ex
ception is:
java.lang.ClassNotFoundException: client.Pi
at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
at sun.rmi.transport.Transport$1.run(Unknown Source)
at sun.rmi.transport.Transport$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Sou
rce)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Sour
ce)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: client.Pi
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.rmi.server.LoaderHandler$Loader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at sun.rmi.server.LoaderHandler.loadClassForName(Unknown Source)
at sun.rmi.server.LoaderHandler.loadClass(Unknown Source)
at sun.rmi.server.LoaderHandler.loadClass(Unknown Source)
at java.rmi.server.RMIClassLoader$2.loadClass(Unknown Source)
at java.rmi.server.RMIClassLoader.loadClass(Unknown Source)
at sun.rmi.server.MarshalInputStream.resolveClass(Unknown Source)
at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
at java.io.ObjectInputStream.readClassDesc(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at sun.rmi.server.UnicastRef.unmarshalValue(Unknown Source)
... 11 more

正在启动服务器:

C:\TEMP\RMI\RMIDemo\src>java 
-cp C:\Users\samue_000\public_html\classes\compute.jar;C:\TEMP\RMI\RMIDemo\src 
-Djava.security.policy=server.policy 
-Djava.rmi.server.useCodebaseOnly=false  
engine.ComputeEngine

>> ComputeEngine bound

启动客户端:

C:\TEMP\RMI\RMIDemo\src>java 
-cp C:\Users\samue_000\public_html\classes\compute.jar;c:\Temp\RMI\RMIDemo\src;c:\temp 
-Djava.security.policy=client.policy 
-Djava.rmi.server.codebase=file:/C:/Users/samue_000/public_html/classes 
client.ComputePi

在客户机(c:\temp)的类路径中有所需的客户机。客户机也需要的Pi类。为了告诉服务器这个类的位置,我将一个副本放在一个单独的文件夹中,并使用codebase属性指定了这个文件夹。该类的确切位置是C:/Users/samue\u 000/public\u html/classes/client/Pi。班它都在同一台物理机器上运行(没有虚拟机)。因此,我不明白为什么服务器不从客户机获取代码库并加载所需的客户机。Pi类。

我已经尽量减少发布的信息到所需的部分,以避免过度填充这篇文章。如果有进一步的信息需要帮助我解决这个问题,请让我知道。它快把我逼疯了。我花了数小时和数天的时间研究这个问题。。。

编辑:我使用的代码与本文中描述的几乎相同。唯一的区别是我以编程方式创建rmi注册表,而不是单独启动注册表。所以代码本身不应该有任何问题。只要Pi类在服务器的类路径中,它就可以正常工作。但是一旦Pi类只存在于客户端的代码库和类路径中,它就不再工作了。

共有3个答案

裴楚青
2023-03-14

您可以下载类文件。但是您需要使用路径分隔符终止路径。这就是文件中所说的。这应该是一个评论,但我已经失去了在这个网站上发表评论的权利,直到我达到50点的声誉。

安明亮
2023-03-14

最后不要省略/,试着:

-Djava.rmi.server.codebase=file:/C:/Users/samue_000/public_html/classes/ 
洪逸清
2023-03-14

通常RMI代码库URL是HTTP URL,它们通常引用JAR文件,而不是目录。

-Djava.rmi.server.codebase=file:/C:/Users/samue_000/pubic_html/classes 

这是一个文件:URL,它只能在它应用的同一个系统上工作。如果服务器位于另一台主机上,它将不会对此负责。

然而,由于它都在同一台机器上,所以应该可以工作。你能发布远程接口吗?

 类似资料:
  • 在没有任何Java RMI经验的情况下,我有一个天真的问题,但在搜索互联网后仍然不确定答案。 问题: 对我来说,有两种情况: 场景1:从本地启动一个Java程序,在执行过程中,它从存储在远程机器上的类调用一个方法,然后该方法的类将下载到本地机器上,并继续执行。 场景2:从本地启动Java程序,在执行过程中,它从存储在远程机器上的类调用一个方法,然后该方法将在远程机器上执行,结果将发送回本地机器。(

  • 在所有Amadeus自助服务API中,只有一些机场代码有效。例如,“FRA”可以工作,但“TXL”不能。这是因为API是Beta版,我只使用沙盒版本吗? 示例: https://test.api.amadeus.com/v1/shopping/flight-destinations?origin=FRA 作品 https://test.api.amadeus.com/v1/shopping/fli

  • 你可以在每一篇教程中找到在线的代码范例,但如果你想自己运行教程的Demo或者将正常工作的范例代码与你的代码进行比较,你可以在这里找到在线的GitHub代码仓库。 目前,CMakeLists.txt文件能够正常生成Visual Studio的工程文件和make文件,它能够在Windows和Linux上运行。但是它在Apple的macOS和其它的IDE上还没有进行非常完全的测试,所以如果出现问题你可以

  • 我试图在IntelliJ中使用ctrl空格键快捷方式来完成代码,但每次我这样做时,它都返回“没有建议”。 这是我的项目目录,即使我键入starter然后按ctrl空格键,即使文件存在于项目目录中,也没有“建议”: 我根据这个线程尝试了以下操作(Intellij IDEA CE 12 Android XML代码完成不起作用): > 转到文件- 转到首选项- 转到文件- 我做错了什么?

  • 我正在实现一个简单的JavaRMI应用程序。它的主要目标是加2个整数。代码源如下:客户端和服务器端的AdditionInterface

  • 命令“code”。在这本手册里不起作用? 之前的所有其他步骤都奏效了。如何调用OSX终端中的Visual Studio代码?