我正在尝试制作一个 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 不接受任何类型的类路径启动参数,所以我想知道如何告诉它我希望它承认什么类路径。根据此处的教程:http: //docs.oracle.com/javase/tutorial/rmi/running.html,“您必须确保运行 rmiregistry 的 shell 或窗口没有设置 CLASSPATH 环境变量,或者有一个 CLASSPATH 环境变量,其中不包括您希望下载到远程对象客户端的任何类的路径。” 这听起来与我需要的相反……还是我读错了?是否有人成功启动了使用第三方 jar(commons-io、commons-logging 和 rmiio,在我的情况下)的 RMI 客户端/服务器?
顺便说一句,这是在 Windows 上。
更新
我找到了解决方法。请看下面我的回答。