如何将java webstart与RMI混合使用?

时间:2009-01-20 09:24:53

标签: java rmi java-web-start

我想发布一个使用RMI的webstart应用程序。

我想避免向用户询问RMI服务器的地址,因为分发应用程序的网站也是RMI服务器。

此外,我不知道构建时服务器的地址,因此必须将地址添加到JNLP的临时配置,或者必须在执行时提供地址。这是首选方式:是否可以这样做?

4 个答案:

答案 0 :(得分:2)

我没有完全使用Java RMI(我只使用带有Hessian二进制协议的Java Web Start来执行类似RMI的操作),但至少将服务器地址传递给Web Start客户端应用程序应该很容易。在应用程序中生成JNLP文件时,请将该地址添加为属性:

<jnlp>
  [...]
  <resources>
    [...]
    <property name="serverAddress" value="..." />
  </resources>
</jnlp>

然后,在客户端代码中读取该属性:

String serverAddress = System.getProperty("serverAddress");

我在这里假设分发应用程序的网站知道自己的地址:)

编辑(在构建时不知道地址的额外限制):嗯,分发应用程序的网站是动态还是静态的?

  1. dynamic:动态生成整个JNLP(使用JSP页面或dom4j或其他),或者读取“模板”JNLP XML文件并替换实际的服务器地址
  2. static:我想部署网站的人必须在JNLP文件中手动配置正确的地址吗?

答案 1 :(得分:1)

在我工作的地方,我们正是这样做的,并根据Jonik的回答将RMI注册表的主机名放在JNLP中。在Java 6u10或u11中,Sun关闭了Webstart的几个安全漏洞,包括动态JNLP的问题。为了满足所有安全警告,您必须将JNLP的相同副本放在程序的主jar中。这是为了防止第三方在您的代码中注入额外的jar或参数。程序将在没有它的情况下运行,但会向用户显示信任通知。

我们在构建时知道知道地址,但是有其他动态JNLP问题,因此不得不为每个可能的运行时设置提供JNLP和JAR。这对我们来说更令人头疼,而不是客户的问题,但是如果你签署了你的发行版,那么值得了解。

答案 2 :(得分:1)

JDK包含一个servlet的源代码(在samples / jnlp / servlet目录中),该servlet将适当的值插入到JNLP文件中。您可以使用它将主机名插入JNLP文件。

答案 3 :(得分:0)

我在jnlp中使用变量占位符:

...
<application-desc>
    <argument>{host}</argument>
    <argument>{port}</argument>
</application-desc>
...

在JNLP提供给客户端时,使用Interceptor servlet在运行时替换它们。