RMI注册表问题:使用“file:”URL方案绑定代码库时,rmiregistry可能会导致意外exception

有关Java Update 1.6.0_29的背景知识,请参阅本文的“RMI注册表问题”。

如果我理解正确(我是德语),更新引入了rmiregistry中的一个错误,它无法使用代码库中的file:pattern。

IE以下将不再适用于1.6.0_29:

-Djava.rmi.server.codebase="file:myproject/bin/ ..." 

我们目前正在使用具有file:syntax的代码库的function。 有谁知道使这项工作的解决方法?

注意: 不,我们不想启动本地Web服务器或ftp服务器。

更新:

在Naming.bind上抛出此exception:

 java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: java.lang.ClassNotFoundException: access to class loader denied at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:400) at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:248) at sun.rmi.transport.Transport$1.run(Transport.java:159) at java.security.AccessController.doPrivileged(Native Method) 

我遇到了同样的问题,并且可以确认将JDK降级到早期版本可以解决问题。 我知道,这不是你正在寻找的解决方案,但至少它能让它发挥作用。

以在Windows中运行为例:

步骤1.在C:\ Users \ Jimmy.java.policy中(如果不存在则创建它),附加到以下内容:

 grant { permission java.security.AllPermission; }; 

当然“C:\ Users \ Jimmy”是用户家,请相应更改到您家。 添加AllPermission只是为了快速解决您的问题。 你最好在这里配置一个更准确的FilePermission。


第2步。启动rmiregistry:

 C:\JDK\bin>rmiregistry -J-Djava.rmi.server.codebase=file://C:/workspaces/MyLab/target/classes/ 

(请注意代码库必须以“/”结尾)


步骤3.运行您的服务器和客户端程序。

参考文献:

http://docs.oracle.com/javase/7/docs/technotes/guides/rmi/codebase.html http://docs.oracle.com/javase/7/docs/technotes/guides/security/spec/security -spec.doc3.html http://docs.oracle.com/javase/7/docs/technotes/guides/rmi/enhancements-7.html

看起来没有解决方法,因为它是一个错误,所以等待修复

详情请见

https://bugzilla.redhat.com/show_bug.cgi?id=751203

代码修复http://icedtea.classpath.org/hg/icedtea6/rev/67df573b0734

如果您不需要动态代码下载(在这种情况下您可以使用ftp代码库),解决方案就是将CLASSPATH环境变量设置为jar文件的路径:

Windows:设置CLASSPATH =“path_to_jarfile”

Linux(批处理):CLASSPATH =“path_to_jarfile”导出CLASSPATH

最好的地方是在一些调用RMI服务器的脚本中。 启动RMI服务器时在命令行(-cp选项)中设置类路径没有帮助,因为它不会影响rmiregistry类路径!

如果你在项目的工作目录中启动rmiregistry,它就可以了。 所以你的项目的工作目录和rmiregistry的当前目录应该是相同的。

我最近也遇到过这个问题。 我可以确认,当使用文件:protocol时,rmiregistry必须:

  • 在包含共享类的目录的根目录中启动; 要么
  • 将classpath设置为指向共享类或共享类jar; 要么
  • 使用file://以外的协议(我设置了ngnix并从中提供了jar)。

也许不是你想要的,但你可以用classpath而不是codebase解决这个问题。 如果将所需的类添加到其类路径,则客户端JVM将正常工作。 如果您使用的是file: URL方案,则必须已在localhost上提供这些类。

我有同样的问题,但我无法更改JDK版本。 事实certificate,你可以通过从与你的代码库相同的目录运行/启动rmiregistry来解决它,在我的例子中是目标/类。 所以cd项目/目标/类然后运行rmiregistry&