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&