我正在尝试制作一个Java客户机/服务器应用程序。我在启动应用程序的服务器端时遇到了问题,因为当我试图启动应用程序的服务器端时,它在调用ClassNotFoundException ()方法时一直会遇到Registry.bind。
我从这里的简单教程开始: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或窗口要么设置了no CLASSPATH环境变量集,要么设置了不包括要下载到远程对象客户端的任何类的路径的CLASSPATH环境变量。”听起来跟我需要的正好相反..。还是我看错了?是否有人成功地启动了使用第三方jars的RMI客户机/服务器(在我的例子中,commons、commons和rmiio )?
顺便说一句,这是在Windows上。
更新--我找到了一个绕过它的方法。见下面的答案。
发布于 2013-12-02 20:40:34
(我最初发布这个答案是为了更新我的问题。根据Zecas在其中一个评论中的建议,我把它移到答案部分。)
我能够通过不服从上述问题中提到的第二个教程中的建议来启动服务器部分:
“必须确保要运行rmiregistry的shell或窗口具有无 CLASSPATH环境变量集,或者具有不包括要下载到远程对象客户端的任何类的路径的CLASSPATH环境变量。”
我创建了一个CLASSPATH环境变量,并在其中添加了我的.class输出目录和每个第三方jar文件。我以为我以前试过,但我想不是.我只是想把我的解决方案留给别人,以防别人有同样的问题。
发布于 2014-05-14 00:26:11
关于取消CLASSPATH的注释仅适用于使用RMI代码基特性的情况,正如关于下载类的神秘注释所暗示的那样。
如果您没有使用代码基特性,只需:
rmiregistry,之前根据需要设置CLASSPATH环境变量,如此处所示,或rmiregistry启动-J-Djava.class.path=...如果您这样做了(3),您必须将返回值存储到一个静态变量中,以防止它被垃圾收集,这会导致注册表未导出,这可能导致远程对象的DGC,这可能导致它被GC'd,这将导致侦听线程退出,这可能导致整个JVM退出。
发布于 2012-12-11 22:09:05
没有RMI注册表特定的java类路径。它应该使用与Java系统其他部分相同的类路径。您可以通过在命令行或操作系统环境中指定类路径来设置类路径。虽然有点过时,但这个文档应该会为您指明正确的方向。
https://stackoverflow.com/questions/9440619
复制相似问题