包含多个JAR的RMI

时间:2011-09-02 01:26:22

标签: java jar rmi codebase

我用3 JAR编写RMI程序:

  • RMIServer,包含服务器端类
  • RMIClient包含客户端类
  • RMIResource包含服务器&客户共享内容(接口,自定义例外)

为了制作单独的JAR文件,我在NetBeans中创建了3个项目,然后在其他2个项目的“Libraries / Build”部分中声明了共享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
...

编辑: 我正在使用本地计算机,模拟远程连接。因此我使用'file'协议而不是'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上测试了:

  1. 使用空类路径设置rmiregistry(并cd到java / bin目录)

    set CLASSPATH=""; export CLASSPATH
    start rmiregistry
    
  2. 使用与以前相同的命令启动服务器(模块化Win env更改)

    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
    
  3. 而且......有效!

    我在Linux和Linux上清理/重建了解决方案。 Windows仍然无法在Linux上工作并在Windows上工作......我在两者上使用相同的Netbeans版本!

    有人可以向我解释一下吗?我正在Linux和Linux上使用JDK 6 Windows上的JDK 7:会产生影响吗?

1 个答案:

答案 0 :(得分:0)

文件:代码库无法在本地计算机之外运行。您需要使用HTTP。您可以使用文件:指向共享目录的URL,这样URL在客户端有意义,但这不适用于局域网。

除非您使用代码库功能,否则RMI注册表需要通过其类路径访问共享类:rmiregistry -J-Dclasspath = ...使用LocateRegistry.createRegistry()更简单,然后它在与JVM相同的JVM中你的远程对象当然使用相同的类路径。