首页 文章

<extension>的陈旧JNLP文件(自Java 9以来?)

提问于
浏览
3

我的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 回答

  • 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

    在我迄今为止的测试经验中,Java 9几乎从未获得新的JNLP . 我必须清除缓存,如上所述,我们不能指望用户这样做 . 我不知道如何更改HREF是一种解决方案,因为这会破坏每个桌面链接 . 如果用户转到HTML页面并重新单击ICON(我们将更改为新的HREF),则可以正常工作 . 但这不是解决方案 . 我目前正在考虑这是一个Java 9 Java Web Start错误,我希望他们能尽快修复它 . 我会发布一个错误报告,如果还没有 . 现在看 .

相关问题