我有一个RMI应用程序的项目。 当我可以在eclipse(RMI Plugin)下成功测试它们时,我试图将它们作为jar文件导出,并带有eclipse的导出功能。
问题是只有一个应用程序与导出的jar文件一起正常工作。
java -jar registry.jar
java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: common.Registry <-- ???
错误消息显示找不到类。我解压缩jar文件,发现该类在jar文件中导出得很好。
temp> unzip registry.jar
Archive: registry.jar
inflating: META-INF/MANIFEST.MF
creating: client/
inflating: client/ChatClientImpl.class
creating: common/
inflating: common/ChatRoomProvider.class
inflating: common/Entity.class
inflating: common/ChatRoomServer.class
inflating: common/ChatClient.class
inflating: common/Registry.class <<<---
这是来自rmiregistry的消息:
Exception dispatching call to [0:0:0, 0] in thread
"RMI TCP Connection(2)-146.6.53.181" at Sun Nov 03 20:33:25 CST 2013:
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: common.Registry
这是发生错误的代码:
try {
// clients and providers can access with the name Registry
Naming.rebind("Registry", new RegistryImpl()); <--
} catch (Exception e) {
e.printStackTrace();
}
可能是什么问题?为什么jar文件在jar文件中找不到类文件?
临时解决方案如下:
java -Djava.rmi.server.codebase=file:/WHERE_THE_BIN_IS/bin/ -jar registry.jar
我可以明确指向代码库目录,但jar文件中已经有相同的代码。
答案 0 :(得分:1)
当我执行rmiregister并设置代码库所在的CLASSPATH时,此问题已得到解决。
export CLASSPATH=SOMEWHERE_THE_LOCAL_BASE_IS_LOCATED
rmiregistry