JDK7u21的发行说明指定了与RMI相关的更改:
在此版本中,RMI属性java.rmi.server.useCodebaseOnly默认设置为true。在以前的版本中,默认值为false。 这种默认值的更改可能会导致基于RMI的应用程序意外中断。典型的症状是堆栈跟踪,其中包含包含嵌套java.rmi.UnmarshalException的java.lang.ClassNotFoundException。 如果出现这些异常,解决此问题的首选方法是通过在java.rmi.server.codebase系统属性中指定适当的值,将所有RMI客户端和服务器配置为使用相同的代码基。这通常是通过在启动应用程序的命令中添加-D选项来完成的: java -D
它还在文档这里中指定,解决方法是将java.rmi.server.useCodebaseOnly属性设置为false。
但是,即使我显式地将此属性设置为false,也会得到上面提到的异常。这里有线索吗?
如果我必须按照上面描述的首选方法来解决这个问题(通过设置-Djava.rmi.server.codebase=file:////(path-to-remote-classes)/,),那么我应该在这里设置哪条路径?我的工作空间/垃圾箱?
发布于 2013-08-22 12:41:03
对不起,我自己解决的。问题是,传递给我的.ksh文件的参数数量是错误的。这导致启动RMI注册表时出现问题。
发布于 2013-08-21 18:58:23
您必须确保在使用远程类的所有JVM上设置属性。这包括您的RMI服务器、RMI客户端、和( RMI注册表)。如果它们都在同一台机器上,那么可以将它们上的java.rmi.server.codebase设置为指向类的位置的file: URL。如果它们不在同一台机器上,则可以使用HTTP使类可用,然后设置远程JVM(可能是客户端)的代码基属性,以使用指向类可用位置的http: URL。或者,您可以通过其他一些方法(例如复制这些类或使用共享文件系统)使远程JVM可以使用这些类,然后将代码基属性设置为file: URL。
您尝试将java.rmi.server.useCodebaseOnly设置为false的解决方案可能会有以下几个原因:您可能没有在所有交互JVM中设置它,或者您可能没有将代码基属性设置为正确的值。
由于您不得不在配置注册表和所有客户端时遇到麻烦,所以最好将他们的codebase属性设置为正确的URL,而不是寻求将useCodebaseOnly设置为false的解决方案。
发布于 2013-08-22 01:33:45
你需要:
false,并确保将java.rmi.server.codebase设置为可用于发送类可能需要下载的对象的JVM,或者java.rmi.server.codebase属性启动的,该属性指向该JVM的可用代码基。这是一个非常奇怪的变化。我没有看到任何安全含义,只是一个讨厌的改变,它改变了所有代码库接收者的语义。使用useCodebaseOnly=true,您必须在接收JVM上设置java.rmi.server.codebase,否则只需要在发送JVM时设置它。从文档中可以看出这一点。
https://stackoverflow.com/questions/18358498
复制相似问题