【问题标题】:java.rmi.server.codebase not working on linuxjava.rmi.server.codebase 无法在 Linux 上运行
【发布时间】:2013-05-28 20:30:48
【问题描述】:

我正在使用 rmi 开发类似 Twitter。 我在 Windows 上工作,一切正常。

但在 linux 上我有:

java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
    java.lang.ClassNotFoundException: server.SimpleBark
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:196)
    ...

客户端弹出这个异常,好像客户端没有使用codebase server,codebase server没有收到任何连接。

我再说一遍,在 Windows 上一切正常,我找不到这是从哪里来的。

【问题讨论】:

  • 如果代码在 Windows 上运行,会不会是主机名问题或其他相关问题?您是否尝试指定以下内容:-Djava.rmi.server.hostname=ipAddressHere ?
  • 我只在一台计算机上工作,除了代码库服务器外,在 linux 上一切正常,是的,我试过 -Djava.rmi.server.hostname 它没有改变任何东西

标签: java rmi java-7 classnotfoundexception codebase


【解决方案1】:

From the JDK 7 guides

从 JDK 7 Update 21 开始,RMI 属性 java.rmi.server.useCodebaseOnly 默认设置为true。

From the JDK 7 guides, that hasn't been updated

java.rmi.server.useCodebaseOnly

如果该值为真,则禁止自动加载类 本地 CLASSPATH 和 java.rmi.server.codebase 除外 在此 VM 上设置的属性。使用此属性可防止客户端 VM 从其他代码库动态下载字节码。这个性质 在 1.2 和 1.2.1 的实现中因为一个 bug 而被忽略。

因此,您的 Windows 机器上的 Java 版本似乎已过时。更新后,解决此问题的最佳方法是在客户端包含所需的类,而不是通过网络动态加载类。

【讨论】:

  • 谢谢,-Djava.rmi.server.useCodebaseOnly=false 成功了。但这是一个学校项目,我需要动态加载课程。我有办法安全吗?
【解决方案2】:

只需从客户端和注册表类路径中删除类即可。

【讨论】:

    猜你喜欢
    • 2012-06-08
    • 2017-08-20
    • 2014-04-08
    • 2013-04-10
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 2017-05-26
    • 2020-07-16
    相关资源
    最近更新 更多