有关Java Update 1.6.0_29的背景信息,请先参阅本文的"RMI注册表问题"一节。
如果我理解正确(我是德国人),更新在rmiregistry中引入了一个错误,该错误无法与代码库中的file:模式一起工作。
即下面的代码将不再适用于1.6.0_29:
-Djava.rmi.server.codebase="file:myproject/bin/ ..."
我们目前使用的特性是拥有一个带有file:语法的代码库。有人知道这个工作的变通方法吗?
注意:不,我们不想启动本地web服务器或ftp服务器
更新:
命名。绑定此异常被抛出:
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。
grant { permission java.security.AllPermission; };
当然"C:UsersJimmy"是用户家,请相应更改为您的家。添加AllPermission只是为了快速解决您的问题。你最好在这里配置一个更准确的FilePermission。
步骤2。开始rmiregistry:
C:JDKbin>rmiregistry -J-Djava.rmi.server.codebase=file://C:/workspaces/MyLab/target/classes/
(请注意代码库必须以"/"结尾)
步骤3。运行服务器端和客户端程序
引用:
http://docs.oracle.com/javase/7/docs/technotes/guides/rmi/codebase.htmlhttp://docs.oracle.com/javase/7/docs/technotes/guides/security/spec/security-spec.doc3.htmlhttp://docs.oracle.com/javase/7/docs/technotes/guides/rmi/enhancements - 7. - html
看起来没有解决办法,因为这是一个bug,所以等待修复
详情见
https://bugzilla.redhat.com/show_bug.cgi?id=751203代码修复http://icedtea.classpath.org/hg/icedtea6/rev/67df573b0734
如果您不需要动态代码下载(在这种情况下,您可以使用ftp codebase),解决方案是简单地将CLASSPATH环境变量设置为jar文件的路径:
窗口:设置CLASSPATH = " path_to_jarfile "
Linux(批):CLASSPATH = " path_to_jarfile "export CLASSPATH
最好的地方是在调用RMI服务器的脚本中。在启动RMI服务器时在命令行中设置类路径(-cp选项)没有帮助,因为它不会影响RMI注册表的类路径!
如果您在项目的工作目录中启动rmiregistry,它就会工作。所以项目的工作目录和rmiregistry的当前目录应该是一样的
我最近也遇到了这个问题。我可以确认,当使用file:协议时,rmiregistry必须:
- 在包含共享类的根目录下启动;或
- 设置类路径指向共享类或共享类jar;或
- 使用一个协议而不是file://(我设置了nnix并从那里提供了jar)。
可能不是您想要的,但是您可以使用类路径而不是代码库来解决这个问题。如果您将所需的类添加到其类路径中,客户机JVM将正常工作。如果您正在使用file:
URL方案,那么这些类必须已经在本地主机上可用。
我有同样的问题,但我无法更改JDK版本。事实证明,您可以通过从与代码库相同的目录(在我的例子中是target/classes)运行/启动rmiregistry来解决这个问题。cd project/target/classes然后运行rmiregistry &