我有两个使用RMI连接到的服务器AServer和BServer。

AServer的相关代码为:

int port = Integer.parseInt("1234");
String url = "rmi://localhost:" + port + "/Aclass";
System.out.println("binding " + url);
Naming.rebind(url, new AClass());


BServer的相关代码为:

int port = Integer.parseInt("1234");
String url = "//localhost:" + port + "/Bclass";
System.out.println("binding " + url);
Naming.rebind(url, new BClass());


在ArchLinux / CentOS上,当我为AServer运行以下命令时:

 java -cp ".:./protobuf.jar" -Djava.rmi.server.codebase=protobuf.jar -Djava.security.policy=policy AServer


以及BServer的相应代码:

 java -cp ".:./protobuf.jar" -Djava.rmi.server.codebase=protobuf.jar -Djava.security.policy=policy BServer


而对于AServer,控制台将打印:

 binding rmi://localhost:1234/AServer
 server rmi://localhost:1234/AServer is running...


BServer打印:

binding rmi://localhost:1234/BServer
Place server failed:Error unmarshaling return; nested exception is:
     java.net.MalformedURLException: no protocol: protobuf.jar
java.rmi.UnmarshalException: Error unmarshaling return; nested exception is:
java.net.MalformedURLException: no protocol: protobuf.jar
     at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:247)
     at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:379)
     at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
     at java.rmi.Naming.rebind(Naming.java:177)
     at BServer.main(BServer.java:31)
Caused by: java.net.MalformedURLException: no protocol: protobuf.jar
     at java.net.URL.<init>(URL.java:586)
     at java.net.URL.<init>(URL.java:483)
     at java.net.URL.<init>(URL.java:432)
     at sun.rmi.server.LoaderHandler.pathToURLs(LoaderHandler.java:770)
     at sun.rmi.server.LoaderHandler.getDefaultCodebaseURLs(LoaderHandler.java:141)
     at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:170)
     at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:637)


这表明该错误必须在Name.rebind()命令中,但据我所知,URL格式正确,这让我很困惑。

两台服务器在运行以下命令的Mac OS中均可正常运行:
     java -cp“。:./ protobuf.jar” -Djava.security.policy =策略AServer

它们可以按我希望的那样完美地工作,但是在ArchLinux / CentOS中,我需要添加

-Djava.rmi.server.codebase = ...或者我收到NoClassDefFoundError。

最佳答案

代码库规范的元素是URL,而不是文件名。您尚未指定协议或绝对路径。

无论如何它都行不通。 java.rmi.server.codebase必须以对等端可理解的形式表示。仅重复一个classpath元素是不够的。

10-06 13:09