为什么 RMI 注册表忽略 java.rmi.server.codebase 属性
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/16769729/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Why RMI registry is ignoring the java.rmi.server.codebase property
提问by mottalrd
I am running a Hello World example for java RMI
我正在为 java RMI 运行一个 Hello World 示例
1) I run the registry in an empty folder
1)我在一个空文件夹中运行注册表
motta@motta-laptop ~/tmp $ rmiregistry
2) I start the HTTP server to retrieve the classes at runtime. The download folder contains the remote interface for the client-server
2) 我启动 HTTP 服务器以在运行时检索类。下载文件夹包含客户端-服务器的远程接口
motta@motta-laptop ~/download $ java NanoHTTPD 8080
3) I start the server passing the java.rmi.server.codebase property as suggested in the java RMI tutorial
3)我按照java RMI教程中的建议启动服务器,传递java.rmi.server.codebase属性
motta@motta-laptop ~/server $ java -Djava.rmi.server.codebase="http://localhost:8080" WarehouseServer
The RMI registry is not contacting the HTTP server and is throwing an exception (see details after the question). But if I do the following
RMI 注册中心未联系 HTTP 服务器并抛出异常(请参阅问题后的详细信息)。 但是,如果我执行以下操作
1) Start the rmi registry with the java.rmi.server.codebase property
1) 使用 java.rmi.server.codebase 属性启动 rmi 注册表
motta@motta-laptop ~/tmp $ rmiregistry -J-Djava.rmi.server.codebase="http://localhost:8080/"
2) Start the HTTP server as before
2)像以前一样启动HTTP服务器
3) Start the server without any option
3)不带任何选项启动服务器
motta@motta-laptop ~/server $ java WarehouseServer
it works, but why?It seems that with the first procedure the RMI registry is ignoring the java.rmi.server.codebase property
它有效,但为什么呢?似乎在第一个过程中,RMI 注册表忽略了 java.rmi.server.codebase 属性
Thank you
谢谢
=================================
==================================
I am running
我在跑步
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)
The exception from the RMI registry
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.run(Transport.java:177)
at sun.rmi.transport.Transport.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)
回答by Stuart Marks
It seems that with the first procedure the RMI registry is ignoring the
java.rmi.server.codebase
property.
似乎在第一个过程中,RMI 注册表忽略了该
java.rmi.server.codebase
属性。
That's correct. The reason is that, as of JDK 7u21, the java.rmi.server.useCodebaseOnly
property is true
by default, whereas in prior releases it was false
by default.
没错。原因是,从 JDK 7u21 开始,该java.rmi.server.useCodebaseOnly
属性是true
默认的,而在之前的版本中是false
默认的。
When useCodebaseOnly
is false
, the RMI Registry (and RMI clients) use the codebase that has been passed to them from the server. Now that the default value is true
the registry and clients ignore the server's codebase property. The registry and clients must either set their own codebase property to match that of the server, or (not recommended) they could set useCodebaseOnly
back to false
. See RMI Enhancements in JDK 7for further details.
当useCodebaseOnly
是 时false
,RMI 注册表(和 RMI 客户端)使用从服务器传递给它们的代码库。现在默认值是true
注册表,客户端忽略服务器的代码库属性。注册中心和客户端必须要么设置他们自己的代码库属性以匹配服务器的代码库属性,要么(不推荐)他们可以设置useCodebaseOnly
回false
. 有关更多详细信息,请参阅JDK 7 中的 RMI 增强功能。
The RMI Tutorialhasn't been updated to reflect this change. Sorry about that. I'll make sure it gets updated.
该RMI教程尚未更新以反映这一变化。对于那个很抱歉。我会确保它得到更新。