我试图禁止Java缓存JNLP文件,因为每次运行它时,我都会向它传递不同的 <argument>
...但是,我似乎无法强制它使用 <update check="always" policy="always"/>
更新自身 . 我也尝试在http响应头中设置 Last-Modified
属性,但这也不起作用 .
jar保持不变,所以我不能真正使用 version
属性强制它更新......
什么是正确的方法:
-
禁用JNLP文件缓存
-
强制它始终更新JNLP文件
-
每次JNLP启动时正确传递不同的参数
这是我的JNLP文件,请注意 <argument>
从Web浏览器启动时可能会有所不同,JNLP文件是从Web动态生成的:
<jnlp spec="1.0+" codebase="https://blah.blah.com/jnlp/jar/*/">
<information>
<title>JNLP Launcher</title>
<vendor>Blah</vendor>
<homepage href="http://www.blah.com"/>
<description>JNLP Launcher</description>
</information>
<security>
<all-permissions/>
</security>
<update check="always" policy="always"/>
<resources>
<java href="http://java.sun.com/products/autodl/j2se" version="1.7+"/>
<jar href="https://blah.blah.com/jnlp/jar/LauncherSigned.jar" download="eager" main="true"/>
</resources>
<application-desc main-class="com.blah.jnlp.Launcher">
<argument>{"javawebstart" : "isfullofshit"}</argument>
</application-desc>
</jnlp>
1 回答
Java Web Start永远不会更新客户端计算机上的JNLP文件内容 . 但是,如果任何资源更新,它的性能将完美无瑕 .
例如 :
如果您在服务器上托管的jnlp文件中注释了一个helper.jar资源 . 在对服务器的.jnlp进行更改之前,web start并未将此更改反映到已下载jnlp文件的任何客户端 .
但是,如果您完全删除了您所评论的jar文件所拥有的类的引用,并且 recompiled all the resources and redeployed 他们 . 此时,意外的java web start变得主动并反映您在服务器上所做的所有更改 .
说到你的观点: You are changing your .jnlp file ,这意味着由于一些神秘的原因,你的改变不会反映给客户 .
Solution :
Approach I(Complex):
你必须以某种方式反映你在任何jar中的变化,所以web start可以把它们拿起来 . 这是一个粗略的草图:
1.创建一个新类作为应用程序的入口点 .
2.在此类中检查服务器的.jnlp文件的最后修改标头 .
3.如果最后修改日期与您的本地jnlp文件不同 . 那么,从服务器替换客户端jnlp简单下载jnlp文件 .
4.在客户端上重新启动.jnlp文件 .
我很久以前就这样做了,但我的要求只是在应用程序启动时重新加载.jnlp文件 . 所以,没有检查最后修改过的.jnlp文件 .
Approach II (Simple):
1.清洁简单 . 介绍一个入口点类“MainClassArgument.java” .
2.将.jnlp文件作为主类指向此类 .
3.启动主类的实例,从此类将hardCoded参数传递给主类
因此,使用此方法时,每次要更改参数时都需要重新编译该类 .
这将欺骗java web start立即反映您对客户的更改 .
希望这可以帮助 :)
Note : 有问题你要求禁用java web start缓存,这对 .jnlp file is not cached 没有帮助,它存储在客户端机器上 . Java Web Start文档从未提及它在客户端更新.jnlp文件 . 根据Web启动,更新仅限于资源更新 . 我们必须找出自己的策略来更新客户端.jnlp文件 .