【问题标题】:Executable RMI JAR file ClassNotFoundException for Stub存根的可执行 RMI JAR 文件 ClassNotFoundException
【发布时间】:2014-01-26 21:33:06
【问题描述】:

我有一个工作的 RMI 服务器程序,我可以直接从 .class 文件编译和执行它。

但是,当我尝试为这些程序中的每一个创建 JAR 文件时,我得到一个 ClassNotFoundException: ChatImpl_Stub 导致 RemoteException 在执行时。

我的清单是(最后加上一个空行):

Main-Class: Server
Class-Path: chat-RMI-common.jar

其中 chat-RMI-common 是一个 JAR 文件,其中包含客户端的聊天界面。

我成功创建了 JAR:

jar cvmf ..\MANIFEST.MF chat-RMI-server.jar *.class

服务器 JAR 确实包含 ChatImpl_Stub。但是,当我尝试启动 JAR 文件时出现异常:

java -Djava.rmi.server.codebase="file:chat-RMI-common.jar file:chat-RMI-server.jar"
    -Djava.security.policy=..\security.policy
    -jar chat-RMI-server.jar

在调用涉及 ChatImpl 的 Naming.rebind 函数时出现异常(在程序开头)。

我的安全政策:

grant {
    permission java.security.AllPermission;
}

我还忘记了什么?提前感谢您的宝贵时间。

【问题讨论】:

    标签: java jar rmi classnotfoundexception


    【解决方案1】:

    仔细查看堆栈跟踪。注册表找不到类。它需要在注册表的 CLASSPATH 上。因此,您要么需要在其 CLASSPATH 上使用正确的 JAR 来启动 Registry,要么最好还是在服务器 JVM 中使用 LocateRegistry.createRegistry() 来启动它。

    【讨论】:

    • 现在可以了,我选择了惰性选项(createRegistry()),谢谢。知道如何在清单中嵌入 java.codebase 和 java.security.policy 选项,而不是使用脚本来运行 JAR 吗? PS:我会接受你的回答,只是想先尝试一两件事;)
    • 您不能将其中任何一个嵌入到清单中,但您可以在 main() 中将它们设置为系统属性。您可以考虑使用 JWS,它允许您将系统属性嵌入到 XML 文件中。
    • 我得到与注册表类所需的 jar 文件相同的错误
    • @fanky 除了您可能知道您的 JAR 文件中的内容之外,还有其他人吗?这个问题很荒谬。
    猜你喜欢
    • 2019-09-05
    • 1970-01-01
    • 2013-11-18
    • 2023-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    相关资源
    最近更新 更多