1

JDK7u21 的发行说明指定了与 RMI 相关的更改:

从这个版本开始,RMI 属性 java.rmi.server.useCodebaseOnly 默认设置为 true。在以前的版本中,默认值为 false。

默认值的这种更改可能会导致基于 RMI 的应用程序意外中断。典型的症状是包含 java.rmi.UnmarshalException 的堆栈跟踪,其中包含嵌套的 java.lang.ClassNotFoundException。

如果发生这些异常,解决问题的首选方法是通过在 java.rmi.server.codebase 系统属性中指定适当的值,将所有 RMI 客户端和服务器配置为使用相同的代码库。这通常通过在启动应用程序的命令中添加 -D 选项来完成:java -Djava.rmi.server.codebase=file:////(path-to-remote-classes)/

它还在此处的文档中指定解决方法是将java.rmi.server.useCodebaseOnly属性设置回 false。

但是,即使我将此属性显式设置为 false,我也会遇到上述异常。请问这里有什么线索吗?

如果我必须通过上述首选方式解决它(通过设置 -Djava.rmi.server.codebase=file:////(path-to-remote-classes)/,那么我应该设置哪个路径在这里?我的工作区/垃圾箱?

4

3 回答 3

2

您必须确保在所有使用远程类的 JVM 上设置属性。这包括您的 RMI 服务器、RMI 客户端RMI 注册表。如果它们都在同一台机器上,那么您可以将java.rmi.server.codebase它们全部设置为file:指向类位置的 URL。如果它们不在同一台机器上,那么您可以使用 HTTP 服务器使这些类可用,然后将远程 JVM(可能是客户端)的代码库属性设置为使用http:指向可用类的 URL 的 URL。或者,您可以通过其他方式使这些类对远程 JVM 可用,例如复制它们或使用共享文件系统,然后将 codebase 属性设置为file:URL。

由于以下几个原因,您尝试应用设置的变通方法java.rmi.server.useCodebaseOnly可能false不起作用:您可能没有在所有交互的 JVM 中设置它,或者您可能没有将代码库属性设置为正确的值。

由于您不得不麻烦配置注册表和所有客户端,因此您最好将其codebase属性设置为正确的 URL,而不是寻求设置useCodebaseOnlyfalse.

于 2013-08-21T18:58:23.837 回答
0

您需要:

  1. 将其设置为false下载类的所有 JVM,并确保将java.rmi.server.codebase其设置为在所有发送其类可能需要下载的对象的 JVM 上可用的东西,或者

  2. 不要管它,但要确保系统中的每个 JVM 都使用java.rmi.server.codebase指向该 JVM 可用代码库的属性启动。

这是一个非常奇怪的改变。我没有看到任何安全隐患,只是一个令人讨厌的变化,它改变了所有代码库接收者的语义。使用useCodebaseOnly=true,您必须java.rmi.server.codebase接收JVM 上进行设置,否则您只需在发送 JVM 上进行设置。这在文档中并不清楚。

于 2013-08-22T01:33:45.977 回答
0

对不起,我自己解决了。问题是传递给我的 .ksh 文件的参数数量错误。这导致了启动 RMI 注册表的问题。

于 2013-08-22T12:41:03.113 回答