mot*_*lrd 7 java rmi rmiregistry nanohttpd
我正在运行java RMI的Hello World示例
1)我在一个空文件夹中运行注册表
motta@motta-laptop ~/tmp $ rmiregistry
Run Code Online (Sandbox Code Playgroud)
2)我启动HTTP服务器以在运行时检索类.download文件夹包含客户端 - 服务器的远程接口
motta@motta-laptop ~/download $ java NanoHTTPD 8080
Run Code Online (Sandbox Code Playgroud)
3)我按照java RMI教程的建议启动服务器传递java.rmi.server.codebase属性
motta@motta-laptop ~/server $ java -Djava.rmi.server.codebase="http://localhost:8080" WarehouseServer
Run Code Online (Sandbox Code Playgroud)
RMI注册表未联系HTTP服务器并且抛出异常(请参阅问题后的详细信息). 但如果我做以下事情
1)使用java.rmi.server.codebase属性启动rmi注册表
motta@motta-laptop ~/tmp $ rmiregistry -J-Djava.rmi.server.codebase="http://localhost:8080/"
Run Code Online (Sandbox Code Playgroud)
2)像以前一样启动HTTP服务器
3)没有任何选项启动服务器
motta@motta-laptop ~/server $ java WarehouseServer
Run Code Online (Sandbox Code Playgroud)
它有效,但为什么呢?似乎在第一个过程中,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)
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
Stu*_*rks 13
看来,在第一个程序中,RMI注册表忽略了该
java.rmi.server.codebase属性.
那是对的.原因是,从JDK 7u21开始,默认情况下java.rmi.server.useCodebaseOnly属性true,而在以前的版本中false,默认情况下属性.
当useCodebaseOnly是false时,RMI注册(和RMI客户端)使用已传递给它们从服务器的代码库.现在默认值是true注册表,客户端忽略服务器的codebase属性.注册表和客户端必须设置自己的codebase属性以匹配服务器的属性,或者(不推荐)它们可以设置useCodebaseOnly回来false.有关更多详细信息,请参阅JDK 7中的RMI增强功能.
该RMI教程尚未更新以反映这一变化.对于那个很抱歉.我会确保它得到更新.
| 归档时间: |
|
| 查看次数: |
11415 次 |
| 最近记录: |