这可能吗?(假设 Java 6)
一个人为/简单的例子来说明我的观点是:
- 我有一个定义明确的 RMI 接口,永远不会改变(一个 JAR 文件,没有模板参数)
- 在主机 X 上运行的 RMIRegistry;
- RMI 服务,它从主机 Y 到它的 registry.rebind()(主机 X 上的 RMIRegistry);和
- 从主机 Z 执行 RMI 调用的 RMI 客户端
如果可能,我将如何在 RMI 服务(主机 Y 上的进程)上指定属性“java.rmi.server.codebase”?
如果主机 A 和 B 是同一台机器,则当“java.rmi.server.codebase”为“file:///C:/rmiCodebase/myCommonInterface.jar”时,此配置有效
如果主机 A 和 B 在不同的机器上,那么我在重新绑定时得到以下异常(在主机 Y 上设置了相同的“java.rmi.server.codebase”):
java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException:
如果主机 A 和 B 位于不同的机器上,并且我通过 Web 服务器使接口 JAR 可用(其中“java.rmi.server.codebase”是“http://Y/rmiCodebase/myCommonInterface.jar”或“ http://Z/rmiCodebase/myCommonInterface.jar"),然后我在重新绑定时得到这个稍微不同的错误:
java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
java.rmi.AccessException: Registry.Registry.rebind disallowed; origin /10.0.190.25 (host Y) is non-local host
我有点困惑 - 如果所有 RMI 服务都必须在与 RMIRegistry 相同的物理主机上运行,这似乎非常受限制(这是我成功开始工作的唯一事情)
归根结底,我只希望机器 Z 能够对运行在机器 Y 上的服务进行 RMI 调用。我正在为机器 Y 和 Z 上运行的进程提供 myCommonInterface.jar。我什至不希望机器 X 必须使用通用(远程)接口做任何事情!
虽然以下链接很有用,但它不能帮助我回答这个问题:http: //download.oracle.com/javase/1.4.2/docs/guide/rmi/codebase.html