2017-10-20 42 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

相关问题