我想发布一个使用RMI的webstart应用程序。
我想避免向用户询问RMI服务器的地址,因为分发应用程序的网站也是RMI服务器。
此外,我不知道构建时服务器的地址,因此必须将地址添加到JNLP的临时配置,或者必须在执行时提供地址。这是首选方式:是否可以这样做?
答案 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 :(得分: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在运行时替换它们。