我的Java Web Start应用程序的JNLP文件在 <resources>
中包含一个 <extension href="...">
标记,用于引用第二个JNLP文件,该文件又引用让我们说的公共资源 . 直到现在都没问题(我想) .
但是,在启动JNLP文件时,使用Java 9(内部版本9.0.1 11)时,无法加载第二个JNLP文件中引用的某些资源,因为它们不再存在 . 这是因为Java Web Start仍然有一个陈旧版本的JNLP(在其缓存中)引用,例如“foo-1.2.jar”(不再存在),而当前版本的JNLP引用“foo-1.3.jar” .
这是一个Java 9错误还是我错过了什么?
Update 1: 由于这些常见(或共享)资源不经常更新,我现在不确定在Java 9之前是否已经存在此问题 .
Update 2: 第二个想法,也许问题是我没有在jnlp元素上指定href . 虽然在第一个JNLP中故意(因为在运行时插入了application-desc参数,在重新加载时会丢失),但在第二个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>
2 回答
来自JNLP specification - 6下载和缓存资源:
我强调了适用于您情况的相关位 . 我认为这里发生的是,一旦您的扩展程序下载到缓存中,它永远不会更新JNLP扩展中的更改 .
您可以做的是JNLP
href
的版本,即以https://example.com/shared/shared-1.0.jnlp
开头并在内容更改时更新版本(https://example.com/shared/shared-1.1.jnlp
,...) .或者,您可以使用扩展名的
version
属性 .在我迄今为止的测试经验中,Java 9几乎从未获得新的JNLP . 我必须清除缓存,如上所述,我们不能指望用户这样做 . 我不知道如何更改HREF是一种解决方案,因为这会破坏每个桌面链接 . 如果用户转到HTML页面并重新单击ICON(我们将更改为新的HREF),则可以正常工作 . 但这不是解决方案 . 我目前正在考虑这是一个Java 9 Java Web Start错误,我希望他们能尽快修复它 . 我会发布一个错误报告,如果还没有 . 现在看 .