当前位置: 首页 > 知识库问答 >
问题:

的过时JNLP文件(从Java 9开始)

吴升
2023-03-14

我的Java Web Start应用程序的JNLP文件包含一个

但是,对于Java 9(build 9.0.1 11),在启动JNLP文件时,无法加载第二个JNLP文件中引用的一些资源,因为它们不再存在。这是因为JavaWebStart仍然有一个陈旧版本的JNLP(在其缓存中)引用,例如“foo-1.2.jar”(不再存在),而JNLP的当前版本引用“foo-1.3.jar”。

这是一个Java 9错误还是我遗漏了什么?

更新1:由于这些公共(或共享)资源不经常更新,我现在不确定这个问题是否可能在Java9之前就已经存在。

更新2:转念一想,也许问题是我没有在jnlp元素上指定href。虽然在第一个JNLP中是故意的(因为在运行时插入了应用程序-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个答案

柯浩壤
2023-03-14

根据我到目前为止的测试经验,Java 9几乎从未获得过新的JNLP。我必须清除缓存,如上所述,我们不能期望用户这样做。我不认为更改HREF是一种解决方案,因为这会破坏每个桌面链接。如果用户转到一个HTML页面并重新单击一个图标(我们会将其更改为新的HREF),该功能就可以正常工作。但这不是一个解决方案。我目前认为这是一个Java9JavaWebStart错误,我希望他们能尽快修复它。我会发布一个bug报告,如果还没有的话。现在看看。

云项禹
2023-03-14

JNLP规范-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属性。

 类似资料:
  • 我想用定制的发布

  • 请快速帮助我从jnlp文件下载jar文件,在缓存中下载的文件是随机命名的,而不是按照jnlp文件名,即它有像345546ACB-1DA47A98-1_2_3_4这样的名称,而不是jarone.jar,请使用正确的URL我需要用于下载下面代码的jar或如何获得在缓存文件夹中下载的jar文件的正确名称。我可以在java控制台中看到所有正确的jar名称,但不能从那里下载

  • 问题内容: 尽我所能,无法使JNLP文件在本地运行(通过双击)。即使我相对于jnlp文件指定了一个jar文件,这似乎也是一个问题。我收到以下错误: href字段的值无效:helloworld.jar 即使JNLP文件与helloworld.jar位于同一文件夹中,也会发生这种情况。我已经进行了搜索,这是一个始终存在的问题,特别是对于那些想要将应用程序打包在CD上并使用JNLP的人来说。Sun唯一提

  • 尝试cassandra快照时发生java错误。 root@cassandramytest]\/usr/local/apache-cassandra-1.1.7/bin/nodetool-h localhost mytest 所以,我添加了 /etc/security/limits.conf 遵循以下步骤:http://www.datastax.com/docs/1.1/troubleshootin

  • 我有一个基于Java 6的Java Web Start应用程序,需要在Windows机器上打开。机器安装了JRE 7,并将JRE 6手动复制到程序文件文件夹中。问题是,每当我想打开JWS应用程序时,它都会使用Java 7打开。即使我使用JRE 6中的可执行文件javaws,一些属性仍然引用JRE 7文件(我通过使用javaws-verbose app.jnlp验证了这一点)。如何仅针对此应用程序强

  • 问题内容: 我有一个需要在Windows机器上打开的基于Java 6的Java Web Start应用程序。机器已安装JRE 7,并将JRE 6手动复制到该文件夹中。问题是,无论何时我想打开JWS应用程序,它都将使用Java 7打开。即使我使用JRE 6中的可执行文件,某些属性仍然引用JRE 7文件(我通过使用进行了验证。如何强制JRE 6仅用于此应用? 问题答案: 我有一个基于Java 6的Ja