如何设置rmiregistry使用的类路径?

Adr*_*ian 15 java rmi rmiregistry classnotfoundexception

我正在尝试制作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不接受任何类型的路径启动arg,所以我想知道如何告诉它我想要它承认什么类路径.根据这里的教程:http://docs.oracle.com/javase/tutorial/rmi/running.html,"你必须确保你将运行rmiregistry的shell或窗口没有设置CLASSPATH环境变量或有一个CLASSPATH环境变量,它不包含你想要下载到远程对象客户端的任何类的路径." 这听起来与我需要的相反......或者我读错了吗?有没有人有任何成功启动使用第三方jar的RMI客户端/服务器(在我的情况下,commons-io,commons-logging和rmiio)?

这是在Windows上,顺便说一下.


更新 我找到了解决方法.请参阅下面的答案.

use*_*421 5

关于取消设置CLASSPATH的注释仅适用于您使用RMI代码库功能的情况,因为关于下载类的神秘话语意在暗示.

如果您没有使用代码库功能,只需:

  1. 在开始之前根据需要设置CLASSPATH环境变量,rmiregistry,如此处其他地方所示,或者
  2. 开始rmiregistry使用-J-Djava.class.path=...
  3. 启动服务器JVM内部注册表,以LocateRegistry.createRegistry().这是在许多方面最好的解决方案,因为它生活,并与JVM死亡,共享其类路径,并捎带与codebase特征,以及的要求.

如果你这样做(3),你必须将返回值存储到一个静态变量,以防止它被当作垃圾回收,这将导致注册表被导出,这可能会导致远程对象的DGC,这可能会导致它被GC'd,这将导致监听线程退出,这可能导致整个JVM退出.


Adr*_*ian 4

(我最初发布这个答案作为我的问题的更新。根据泽卡斯在其中一条评论中的建议,我将其移至答案部分。)

我能够通过不遵守上面问题中引用的第二个教程中的建议来启动服务器部分:

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

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