我正在用 3 个 JAR 编写一个 RMI 程序:
- RMIServer,包含服务器端类
- RMIClient 包含客户端类
- RMIResource 包含服务器和客户端共享内容(接口、自定义异常)
为了制作单独的 JAR 文件,我在 NetBeans 中创建了 3 个项目,然后在其他 2 个项目的“库/构建”部分中声明了共享 Jar。
一切都很好,没有错误。
但是当我尝试通过命令行启动服务器时,这在我想到将共享文件放在一个不同的 JAR 中之前很简单,这突然变得很痛苦......
以下是我尝试过的一些命令示例:
保持 ClassPath 指向服务器资源,但使用双 CodeBase
java -cp ~/NetBeansProjects/RMIServer/dist/RMIServer.jar -Djava.rmi.server.codebase="file:/home/myuser/netbeansprojects/rmiserver/dist/rmiserver.jar file:/home/myuser/netbeansprojects/rmiserver/dist/lib/rmiresource.jar" rmiserver.Shop
结果:
Network exception: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: rmiresource.BookingManager
...
使用双 ClassPath 但保持 CodeBase 指向服务器资源
java -cp "~/NetBeansProjects/RMIServer/dist/RMIServer.jar;~/NetBeansProjects/RMIServer/dist/lib/RMIResource.jar" -Djava.rmi.server.codebase=file:/home/myuser/netbeansprojects/rmiserver/dist/rmiserver.jar rmiserver.Shop
结果:
Exception in thread "main" java.lang.NoClassDefFoundError: rmiserver/Shop
Caused by: java.lang.ClassNotFoundException: rmiserver.Shop
...
使用双 ClassPath 和双 CodeBase
java -cp "~/NetBeansProjects/RMIServer/dist/RMIServer.jar;~/NetBeansProjects/RMIServer/dist/lib/RMIResource.jar" -Djava.rmi.server.codebase="file:/home/myuser/netbeansprojects/rmiserver/dist/rmiserver.jar file:/home/myuser/netbeansprojects/rmiserver/dist/lib/rmiresource.jar" rmiserver.Shop
结果:
Exception in thread "main" java.lang.NoClassDefFoundError: rmiserver/Shop
Caused by: java.lang.ClassNotFoundException: rmiserver.Shop
...
编辑:我正在本地计算机上工作,模拟远程连接。因此我使用“文件”协议而不是“http”。
我错过了什么吗?感谢您提供的任何帮助
我再次测试了我的第一个解决方案,因为它是最有希望的:
java -cp ~/NetBeansProjects/RMIServer/dist/RMIServer.jar -Djava.rmi.server.codebase="file:/home/myuser/netbeansprojects/rmiserver/dist/rmiserver.jar file:/home/myuser/netbeansprojects/rmiserver/dist/lib/rmiresource.jar" rmiserver.Shop
它仍然失败。
然后我在 Windows 上进行了测试:
使用空的类路径设置 rmiregistry(并 cd 到 java/bin 目录)
set CLASSPATH=""; export CLASSPATH start rmiregistry
使用与以前相同的命令启动服务器(以 Win 环境更改为模)
java -cp c:/NetBeansProjects/RMIServer/dist/RMIServer.jar -Djava.rmi.server.codebase="file:/c:/netbeansprojects/rmiserver/dist/rmiserver.jar file:/c:/netbeansprojects/rmiserver/dist/lib/rmiresource.jar" rmiserver.Shop
而且......它奏效了!
我在 Linux 和 Windows 上清理/重建了解决方案,但它仍然无法在 Linux 和 Windows 上运行......我在两者上都使用相同的 Netbeans 版本!
有人可以向我解释吗?我在 Linux 上使用 JDK 6,在 Windows 上使用 JDK 7:这会有影响吗?