当前位置: 首页 > 知识库问答 >
问题:

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

江琦
2023-03-14

我正在运行一个java RMI的Hello World示例

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

motta@motta-laptop ~/tmp $ rmiregistry

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

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注册表。马绍尔群岛共和国。服务器代码基属性

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

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

3) 在没有任何选项的情况下启动服务器

motta@motta-laptop ~/server $ java WarehouseServer

这是可行的,但为什么呢?在第一个过程中,RMI注册表似乎忽略了java。马绍尔群岛共和国。服务器代码基属性

非常感谢。

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

我在跑步

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)

共有1个答案

公良同
2023-03-14

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

那是正确的。原因是,在JDK 7u21中,默认情况下,java.rmi.server.useCodebasOnly属性是true,而在之前的版本中,默认情况下是false。

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

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

 类似资料:
  • 问题内容: 什么是RMI注册表?它有什么作用? 问题答案: 本质上,RMI注册表是服务器注册其提供的服务的场所,也是客户端查询这些服务的场所。请参阅Java RMI简介 。摘抄: 图1显示了使用RMI时客户端建立的连接。首先,客户端必须联系RMI注册中心,并请求服务名称。开发人员B不知道RMI服务的确切位置,但是他知道足够联系开发人员A的注册表。这将使他指向他要致电的服务方向。

  • 我试图建立一个简单的招摇模型: 由于某些原因,生成的HTML没有显示的字段。这让我觉得我做得不对。s 所以问题是,使用一个模型作为一个类型是否真的可以像我试图做的那样<代码>示例如果其父字段是而不是,则会呈现该字段。 更新:我阅读了关于https://swagger.io/docs/specification/adding-examples/的部分,似乎我的代码片段应该已经工作了。

  • 我对iOS布局约束的机制有误解。请参阅下面列出的我放在viewDidLoad中的代码。 在我看来,我的意图是明确的。我想在设备屏幕的中央看到一个按钮。但我只能看到下面的图片。 我在项目控制台中有一个输出,非常可怕,我无法从中理解任何东西。 无法同时满足约束。可能以下列表中至少有一个约束是您不想要的。尝试以下方法:(1)查看每个约束,并尝试找出您不期望的约束;(2) 查找添加了一个或多个不需要的约束

  • 问题内容: 与这两个帖子@iMohammad有关, 在单击JButtonJava时使用JButton增加/减少textArea内的字体大小并在单击JButton Java时更改字体样式 …,我面临着一个非常有趣的问题,该问题来自于on 作为参数传递屏幕 请如何动态调整大小取决于,与我在sscce中尝试过的另一个JComponent正常工作一样 问题答案: 我调试了您的SSCCE,并且传递给的值为空

  • 问题内容: 我一直在将RMI用于当前正在处理的项目,并且希望将多个主机绑定到单个RMI注册表。 但是,当我尝试这样做时,我收到一条错误消息: java.rmi.AccessException:不允许Registry.Registry.bind;origin / 192.168.0.9是非本地主机 我这样做是在谷歌上进行的,似乎RMI默认情况下会阻止远程主机进行绑定,我想知道是否有某种方法可以覆盖或

  • 问题内容: 我将Spring 3.1.3用于Web应用程序,将XML配置与组件扫描结合使用。 我意识到,其中一个扫描组件必须在其他几个组件之前进行初始化。在所有需要构造后初始化的类上,我在方法上具有@PostConstruct批注。 为了设置依赖关系顺序,我在需要先后构造的类上将“ @Component”更改为“ @Component(“ configData”)”。然后,在每个需要在“ conf