为什么RMI注册表忽略了java.rmi.server.codebase属性

我正在为java RMI运行Hello World示例

1)我在一个空文件夹中运行注册表

motta@motta-laptop ~/tmp $ rmiregistry 

2)我启动HTTP服务器以在运行时检索类。 download文件夹包含客户端 – 服务器的远程接口

 motta@motta-laptop ~/download $ java NanoHTTPD 8080 

3)我按照java RMI教程的建议启动服务器传递java.rmi.server.codebase属性

 motta@motta-laptop ~/server $ java -Djava.rmi.server.codebase="http://localhost:8080" WarehouseServer 

RMI注册表未联系HTTP服务器并抛出exception(请参阅问题后的详细​​信息)。 但如果我做以下事情

1)使用java.rmi.server.codebase属性启动rmi注册表

 motta@motta-laptop ~/tmp $ rmiregistry -J-Djava.rmi.server.codebase="http://localhost:8080/" 

2)像以前一样启动HTTP服务器

3)没有任何选项启动服务器

 motta@motta-laptop ~/server $ java WarehouseServer 

它有效,但为什么呢? 似乎在第一个过程中,RMI注册表忽略了java.rmi.server.codebase属性

谢谢

=================================

我在跑步

 java version "1.7.0_21" Java(TM) SE Runtime Environment (build 1.7.0_21-b11) Java HotSpot(TM) 64-Bit Server VM (build 23.21-b01, mixed mode) 

RMI注册表的例外

 Constructing server implementation... Binding server implementation to registry... Exception in thread "main" java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: java.lang.ClassNotFoundException: Warehouse at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:419) at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:267) at sun.rmi.transport.Transport$1.run(Transport.java:177) at sun.rmi.transport.Transport$1.run(Transport.java:174) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.transport.Transport.serviceCall(Transport.java:173) at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:722) at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:273) at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:251) at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:377) at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source) at WarehouseServer.main(WarehouseServer.java:14) 

似乎在第一个过程中,RMI注册表忽略了java.rmi.server.codebase属性。

那是对的。 原因是,从JDK 7u21开始, java.rmi.server.useCodebaseOnly属性默认为true ,而在以前的版本中默认为false

useCodebaseOnlyfalse ,RMI Registry(和RMI客户端)使用从服务器传递给它们的代码库。 现在默认值为true ,注册表和客户端忽略服务器的codebase属性。 注册表和客户端必须设置自己的codebase属性以匹配服务器的属性,或者(不推荐)他们可以将useCodebaseOnly设置为false 。 有关更多详细信息,请参阅JDK 7中的RMI增强function 。

RMI教程尚未更新以反映此更改。 对于那个很抱歉。 我会确保它得到更新。