Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 包含多个JAR的RMI_Java_Jar_Rmi_Codebase - Fatal编程技术网

Java 包含多个JAR的RMI

Java 包含多个JAR的RMI,java,jar,rmi,codebase,Java,Jar,Rmi,Codebase,我正在编写一个带有3个JAR的RMI程序: RMIServer,包含服务器端类 RMIClient包含客户端类 RMIResource包含服务器和客户端共享内容(接口、自定义异常) 为了创建单独的JAR文件,我在NetBeans中创建了3个项目,然后在其他2个项目的“Libraries/Build”部分声明了共享JAR 一切都很好,没有错误 但是,当我试图通过命令行启动服务器时,在我想到将共享文件放在一个不同的JAR中之前,这很简单,这突然让a** 以下是我尝试过的几个命令示例: 保持类路

我正在编写一个带有3个JAR的RMI程序:

  • RMIServer,包含服务器端类
  • RMIClient包含客户端类
  • RMIResource包含服务器和客户端共享内容(接口、自定义异常)
为了创建单独的JAR文件,我在NetBeans中创建了3个项目,然后在其他2个项目的“Libraries/Build”部分声明了共享JAR

一切都很好,没有错误

但是,当我试图通过命令行启动服务器时,在我想到将共享文件放在一个不同的JAR中之前,这很简单,这突然让a**

以下是我尝试过的几个命令示例:

  • 保持类路径指向服务器资源,但使用双代码基

    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
    
    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
    
结果:

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
...
Exception in thread "main" java.lang.NoClassDefFoundError: rmiserver/Shop
Caused by: java.lang.ClassNotFoundException: rmiserver.Shop
...
Exception in thread "main" java.lang.NoClassDefFoundError: rmiserver/Shop
Caused by: java.lang.ClassNotFoundException: rmiserver.Shop
...
  • 使用双类路径,但保持代码库指向服务器资源

    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
    
结果:

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
...
Exception in thread "main" java.lang.NoClassDefFoundError: rmiserver/Shop
Caused by: java.lang.ClassNotFoundException: rmiserver.Shop
...
Exception in thread "main" java.lang.NoClassDefFoundError: rmiserver/Shop
Caused by: java.lang.ClassNotFoundException: rmiserver.Shop
...
  • 使用双类路径和双代码库

    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
    
    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
    
结果:

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
...
Exception in thread "main" java.lang.NoClassDefFoundError: rmiserver/Shop
Caused by: java.lang.ClassNotFoundException: 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上进行了测试:

  • 使用空的类路径(以及到java/bin目录的cd)设置rmiregistry

  • 与以前一样,使用相同的命令启动服务器(修改Win env)

  • 而且。。。成功了

    我在Linux和Windows上清理/重建了解决方案,但它仍然无法在Linux和Windows上运行。。。我在两者上使用相同的Netbeans版本


    有人能给我解释一下吗?我在Linux上使用JDK 6,在Windows上使用JDK 7:这会有影响吗?

    一个文件:代码库无法在本地计算机上运行。您需要使用HTTP。您可能会使用指向共享目录的file:URL,这样URL在客户端就有意义了,但在LAN之外就不起作用了


    除非您使用的是代码库特性,否则RMI注册表需要通过其类路径访问共享类:rmiregistry-J-Dclasspath=。。。使用LocateRegistry.createRegistry()更简单,因为它与远程对象位于同一个JVM中,并且使用相同的类路径。

    我在本地计算机上工作时忽略了expalin,因此RMI只是模拟远程连接。我将尝试更改注册表类路径。