加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

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

发布时间:2020-12-14 04:11:41 所属栏目:Windows 来源:网络整理
导读:我正在为 java RMI运行Hello World示例 1)我在一个空文件夹中运行注册表 motta@motta-laptop ~/tmp $rmiregistry 2)我启动HTTP服务器以在运行时检索类. download文件夹包含客户端 – 服务器的远程接口 motta@motta-laptop ~/download $java NanoHTTPD 8080 3
我正在为 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服务器并抛出异常(请参阅问题后的详细??信息).
但如果我做以下事情

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)

It seems that with the first procedure the RMI registry is ignoring
the java.rmi.server.codebase property.

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

当useCodebaSEOnly为false时,RMI Registry(和RMI客户端)使用从服务器传递给它们的代码库.现在默认值为true,注册表和客户端忽略服务器的codebase属性.注册表和客户端必须设置自己的codebase属性以匹配服务器的属性,或者(不推荐)他们可以将useCodebaSEOnly设置为false.有关详细信息,请参见RMI Enhancements in JDK 7.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读