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



有关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 &

相关内容

  • 没有找到相关文章

最新更新