2017-10-20 106 views
3

我的Java Web Start應用程序的JNLP文件包含<extension href="...">標籤在<resources>引用第二JNLP文件,這反過來又引用我們說的公共資源。直到現在沒有問題(我認爲)。爲<extension>陳舊的JNLP文件(因爲Java的9?)

但是,在啓動JNLP文件時,使用Java 9(build 9.0.1 + 11)時,第二個JNLP文件中引用的某些資源無法加載,因爲它們不再存在。這是因爲Java Web Start仍然具有該JNLP(在其緩存中)的陳舊版本,其引用例如「foo-1.2.jar」(不再存在),而當前版本的JNLP引用「foo-1.3.jar」。

這是Java 9的錯誤還是我錯過了什麼?

更新1:不更新由於這些共同的(或共享)的資源,很多時候,我現在不能確定,如果可能已經存在的Java 9.前

更新2這樣的問題:在第二想想,也許問題是我沒有在jnlp元素上指定href。在第一個JNLP中有意(因爲在運行時插入了應用程序參數,在重載時會丟失),這在第二個JNLP中是偶然的。


第一JNLP看起來像這樣(請注意擴展元素):

<?xml version='1.0' encoding='UTF-8' ?> 
<jnlp 
    spec="6.0+" 
    codebase="https://example.com/158" 
> 
    ... 
    <update check="timeout" policy="always"/> 
    <resources> 
     <java version="9.*" java-vm-args="-Xmx800m --add-opens=java.desktop/java.awt=ALL-UNNAMED --add-opens=java.desktop/sun.awt.dnd=ALL-UNNAMED --add-opens=java.desktop/sun.swing=ALL-UNNAMED" href="http://java.sun.com/products/autodl/j2se"/> 
     <java version="1.8*" java-vm-args="-Xmx800m" href="http://java.sun.com/products/autodl/j2se"/> 
     <jar href="foo-20171018-client.jar" main="true"/> 
     <extension href="https://example.com/shared/shared.jnlp"/> 
    </resources> 
    <application-desc main-class="foo.bar.Baz"><argument>sessionKey</argument><argument>12</argument></application-desc>  
</jnlp> 

第二JNLP看起來是這樣的(引用foo的... JAR):

<?xml version='1.0' encoding='UTF-8' ?> 
<jnlp 
    spec="6.0+" 
    codebase="https://example.com/shared" 
> 
    ... 
    <update check="timeout" policy="always"/> 
    <resources> 
     <java version="9.*" java-vm-args="-Xmx800m --add-opens=java.desktop/java.awt=ALL-UNNAMED --add-opens=java.desktop/sun.awt.dnd=ALL-UNNAMED --add-opens=java.desktop/sun.swing=ALL-UNNAMED" href="http://java.sun.com/products/autodl/j2se"/> 
     <java version="1.8*" java-vm-args="-Xmx800m" href="http://java.sun.com/products/autodl/j2se"/> 
     <jar href="foo-1.3.jar"/> 
     <jar href="jhall-2.0.02.jar"/> 
     <jar href="jmf-2.1.1.e.jar"/> 
     <jar href="forms-1.2.jar"/> 
    </resources> 
    <component-desc/> 
</jnlp> 
+0

您是否嘗試清除Java應用程序緩存(緩存的應用程序和小程序,已安裝的應用程序和小程序)? –

+0

對不起,但沒有。我正在尋找一種解決方案,而無需告訴一千個客戶,他們現在必須清除緩存以便讓我的應用程序再次運行。即使堅持使用Java 8也比這更好。 – mbee

+0

也許你可以向我們展示JNLP文件的相關部分? AFAICT,您可以使用JNLP文件的'version'屬性來引用特定的版本(參見[JNLP文件語法](http://docs.oracle.com/javase/7/docs/technotes/guides/javaws/developersguide/) syntax.html) - 擴展元素):'版本 - 附加擴展jnlp文件的版本。「 –

回答

1

JNLP specification - 6下載和資源緩存

6.5.3管理緩存

的JNLP客戶端是負責管理下載 資源的高速緩存。該JNLP客戶必須確保以下不變 維持:在應用程序運行時屬於一個特定的應用

資源永遠不會從緩存中刪除。

這條規則可以確保應用程序開發人員可以對資源的緩存是應用 運行時 假設。特別是,在整個 程序執行期間,所有熱切下載的資源將在緩存中本地可用。

用於管理緩存的確切策略和算法是依賴於實現的 。一個合理的策略可能是首先清除 之外的標記爲惰性的資源,然後標記爲渴望的資源。

JNLP客戶端還可以以任何它認爲合適的方式管理擴展。 它們可以在任何給定的位置卸載或永久保持在 左右。如果調用擴展卸載程序,則對擴展的另一個 請求將要求再次下載它,並且要重新運行擴展安裝程序 。

我強調了可能適用於您的情況的相關位。我認爲這裏發生的是,一旦你的擴展被下載到緩存中,它就不會在JNLP擴展的更改中更新。

你可以做的是版本的JNLP href,即開始與https://example.com/shared/shared-1.0.jnlp和更新版本,如果內容的變更(https://example.com/shared/shared-1.1.jnlp,...)。

或者您可以使用擴展名的version屬性。

+0

第二個想法,也許問題在於我沒有在jnlp元素上指定href。在第一個JNLP中有意(因爲在運行時插入了應用程序參數),這在第二個JNLP中是偶然的。 – mbee

0

在我迄今爲止的測試經驗中,Java 9幾乎從未獲得新的JNLP。我必須清除緩存,如上所述,我們不能指望用戶這樣做。我沒有看到如何改變HREF是一種解決方案,因爲這會破壞每個桌面鏈接。如果用戶轉到HTML頁面並重新單擊一個ICON,我們將改爲新的HREF。但這不是一個解決方案。我目前正在考慮這是一個Java 9 Java Web Start錯誤,我希望他們很快修復它。我會發佈一個錯誤報告,如果還沒有的話。現在看。

+0

您是否試過''? BTW:改變href是爲第二個JNLP文件引用的。第二個JNLP不應該從桌面鏈接。它不代表一個應用程序,只是共享庫。 – mbee