繁体   English   中英

JDK7u21 RMI更改

[英]JDK7u21 RMI changes

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:////(路径到远程类)/

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

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

而且,如果我必须通过上述首选方法(通过设置-Djava.rmi.server.codebase = file:////(path-to-remote-classes)/)来解决,那么应该设置哪条路径在这里吗?

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

您尝试将将java.rmi.server.useCodebaseOnly设置为false的变通办法可能无法正常工作,原因有两个:您可能未在所有交互的JVM中都将其设置,或者可能未将codebase属性设置为正确的价值。

由于必须麻烦配置注册表和所有客户端,因此您最好将其codebase属性设置为正确的URL,而不是寻求将useCodebaseOnly设置为false的解决方法。

您将需要:

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM