我该如何设置rmiregistry使用的classpath?

15
我正在尝试创建一个Java RMI客户端/服务器应用程序。在启动应用程序的服务器端时,当我尝试调用Registry.bind()方法时,它一直遇到ClassNotFoundException问题。
我最初使用这里的简单教程:http://docs.oracle.com/javase/1.5.0/docs/guide/rmi/hello/hello-world.html。但是,在遵循这些说明之后,它最开始抛出了一个ClassNotFoundException,抱怨无法找到“example.hello.Hello”。通过从教程中的destDir目录中启动rmiregistry,我可以解决这个问题,因为rmiregistry显然将其初始启动目录作为其类路径的一部分。
然后,我开始使用第三方jar文件来编写我的服务器类,直到现在都还好。现在,如果我的服务器类引用任何jar文件中的内容,则Registry.bind()会抛出ClassNotFoundException,因为rmiregistry应用程序不知道这些jar文件。
据我所知,rmiregistry不接受任何类型的classpath启动参数,因此我想知道如何告诉它我希望它确认的classpath。根据这里的教程:http://docs.oracle.com/javase/tutorial/rmi/running.html,“您必须确保运行rmiregistry的shell或窗口要么没有设置CLASSPATH环境变量,要么具有不包括任何要下载到远程对象的客户端的类路径的路径的CLASSPATH环境变量。”这听起来与我所需要的相反...还是我理解错误?是否有人成功启动了使用第三方jar(在我的情况下是commons-io,commons-logging和rmiio)的RMI客户端/服务器?
这是在Windows上。更新 我找到了一个解决方法。请见下面的答案。

3
做得好,特洛伊。友情提醒,请您自己发布一个答案并接受该答案,以便我们关闭这个问题。同时,如果之前的回答解决了您的问题,也请接受它们的答案。请注意不要更改原意,使内容通俗易懂。 - Zecas
@Zecas 这里的问题不是因为有一个被接受的答案而关闭。它们被关闭是因为它们是重复的,或者无法再现,或者与主题无关,或者出于其他质量原因。 - user207421
4个回答

5
如果您使用RMI代码库功能,则有关取消设置CLASSPATH的说明仅适用,因为有关下载类的晦涩说明意味着这一点。
如果您未使用代码库功能,请执行以下操作之一:
1.在启动rmiregistry之前根据需要设置CLASSPATH环境变量,如此处所示。
2.使用-J-Djava.class.path=...启动rmiregistry
3.在服务器JVM中启动Registry,使用LocateRegistry.createRegistry()。在许多方面,这是最好的解决方案,因为它与JVM共享其类路径,并且顺便符合代码库功能的要求。
如果您选择(3),必须将返回值存储在静态变量中,以防止其被垃圾回收,这会导致注册表未导出,从而可能导致远程对象的DGC,这可能会导致它被GC,这将导致监听线程退出,这可能会导致整个JVM退出。

4

我最初将这个答案作为我的问题的更新发布。根据Zecas在评论中的建议,我将其移动到答案部分。

通过不遵守我上面提到的第二个教程中的建议,我成功启动了服务器端:

“你必须确保运行rmiregistry的shell或窗口没有设置CLASSPATH环境变量,或者具有不包括任何要下载到远程对象客户端的类路径的CLASSPATH环境变量。”

我创建了一个CLASSPATH环境变量,并将我的.class输出目录和每个第三方jar文件添加到其中。我认为我以前尝试过,但可能不是......只是想留下我的解决方案,以防其他人有同样的问题。


客户端机器上也必须设置CLASSPATH吗?我得到了ClassNotFoundException:<package>。<class>_stub。 - guru_001

4

没有特定的RMI注册表Java类路径。 它应该使用与Java系统的其余部分相同的类路径。 您可以通过在命令行上指定它或在操作系统环境中指定它来设置您的类路径。 尽管有点过时,但这个文档应该指引您走向正确的方向。


1

如何为rmiregistry设置classpath的示例

Win32:

set CLASSPATH=c:\home\ann\src;c:\home\ann\public_html\classes\compute.jar 

UNIX:

setenv CLASSPATH /home/ann/src:/home/ann/public_html/classes/compute.jar

你可以看到我回答中关于设置classpath的部分,但我认为你只是想贬低我的回答,并没有仔细阅读它们!!! - MCHAppy
我的目标是确保问题得到相关和正确的回答。当我发表评论时,你现在提到的部分并不存在,而你回答中的其他95%仍然不相关。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接