2009-01-20 56 views
3

我想分發使用RMI的webstart應用程序。如何將java webstart與RMI混合?

我想避免向用戶詢問RMI服務器的地址,因爲分發應用程序的網站也是RMI服務器。

此外,我不知道構建時服務器的地址,因此地址必須添加特殊配置到JNLP,或者地址必須在執行時提供。這是首選方式:是否可以這樣做?

回答

2

我沒有使用過的Java RMI正是(我只用Java Web Start的與Hessian二進制協議做這樣的事情RMI),但是通過服務器地址到網絡的至少一部分啓動客戶端應用程序應該是簡單。當您生成您的應用程序的JNLP文件中添加地址作爲一個屬性:

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

然後,在客戶端代碼讀取性能:

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

我這裏假設分發應用程序知道網站它自己的地址:)

編輯(在構建時不知道地址的額外限制):嗯,網站分發應用程序是動態還是靜態?

  1. 動態:無論是動態生成整個JNLP(用JSP頁面或dom4j的或其他),或在地方讀了「模板」 JNLP XML文件,並替換真實服務器地址
  2. 靜:我想人部署該站點的人員必須在JNLP文件中手動配置正確的地址?
+0

謝謝!我根據你的答案改變了問題,以更全面地反映我的需求。 – michelemarcon 2009-01-20 09:56:50

0

我使用變量佔位符在我的JNLP:

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

,並使用攔截器的servlet在運行時作爲JNLP被提供給客戶端,以取代這些。

1

我在哪裏工作,我們正是這樣做的,並根據Jonik的回答將RMI註冊表的主機名放在JNLP中。在Java 6u10或u11中,Sun利用Webstart封閉了一些安全漏洞,其中包括動態JNLP的一個問題。爲了滿足所有的安全警告,你必須在你的程序的主jar中放置一個相同的JNLP副本。這是爲了防止第三方在您的代碼中注入額外的罐子或參數。程序將在沒有它的情況下運行,但用戶將顯示信任通知。

我們知道構建時的地址,但有其他動態的JNLP問題,因此不得不求助於提供JNLP和JAR爲每個可能的運行時設置。這對我們來說更像是一個部署頭痛,而不是客戶的一個問題,但是如果你簽署了你的發行版,那麼值得了解。

1

JDK包含用於向JNLP文件中插入適當值的servlet的源代碼(位於samples/jnlp/servlet目錄中)。您可以使用它將主機名插入到JNLP文件中。