我正在运行java RMI的Hello World示例
1)我在一个空文件夹中运行注册表
motta@motta-laptop ~/tmp $ rmiregistry
2)我启动HTTP服务器以在运行时检索类。下载文件夹包含客户机-服务器的远程接口
motta@motta-laptop ~/download $ java NanoHTTPD 8080
3)我启动服务器传递java. RMI .server.codebase属性,在java RMI教程
中建议motta@motta-laptop ~/server $ java -Djava.rmi.server.codebase="http://localhost:8080" WarehouseServer
RMI注册中心没有联系HTTP服务器,并且抛出了一个异常(参见问题后面的详细信息)。但是如果我执行以下操作
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
。
当useCodebaseOnly
为false
时,RMI注册中心(和RMI客户端)使用从服务器传递给它们的代码库。既然默认值是true
,那么注册中心和客户端就会忽略服务器的codebase属性。注册中心和客户端必须设置自己的代码库属性以匹配服务器的代码库属性,或者(不推荐)将useCodebaseOnly
设置回false
。有关详细信息,请参阅JDK 7中的RMI增强。
RMI教程尚未更新以反映此更改。很抱歉。我会确保它更新了