我面临着JNLP文件的几个问题。我试图禁用Java来缓存JNLP文件,因为每次运行它时,我都会向它传递不同的<argument>
...但是,我似乎无法强制它更新自己使用<update check="always" policy="always"/>
。我还尝试在http响应标头中设置Last-Modified
属性,但这也不起作用。
jar保持不变,所以我无法真正使用version
属性来强制更新...
正确的方法是什么:
这是我的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>
答案 0 :(得分:0)
Java Web Start永远不会更新客户端计算机上的JNLP文件内容。但如果任何资源更新,它的表现会完美无缺。
例如:
如果您在服务器上托管的jnlp文件中注释了一个helper.jar资源。在对服务器的.jnlp进行更改之前,web start并未将此更改反映到已下载jnlp文件的任何客户端。
<!--jar href="helper.jar"/-->
但是,如果你完全删除了jar文件所拥有的类的引用,你评论并重新编译所有资源并重新部署它们。这时,意外的java web start变得主动并反映了所有的变化你在服务器上做过。
说到你的观点:您正在更改.jnlp文件,这意味着由于一些神秘的原因,您的更改不会反映给客户。
解决方案:
方法I(复杂):
你必须以某种方式反映你在任何jar中的变化,所以web start可以把它们拿起来。这是一个粗略的草图:
1.创建一个新类作为应用程序的入口点。
2.在此课程中,检查服务器的.jnlp文件的最后修改标题。
3.如果上次修改日期与您的本地jnlp文件不同。那么,从服务器替换客户端jnlp简单下载jnlp文件。
4.在客户端上重新启动.jnlp文件。
我很久以前就这样做了,但是我的要求只是在应用程序启动时重新加载.jnlp文件。所以,没有检查最后修改过的.jnlp文件。
String[] jarSequence= {"demo.jnlp"};
String codebase = "http://localhost:8818/javawsGame/";
DownloadService ds;
try {
ds =
(DownloadService)ServiceManager.lookup("javax.jnlp.DownloadService");
if (ds != null) {
URL url =
new URL(codebase + jarSequence[0]);
boolean cached = ds.isResourceCached(url, null);
if (cached) {
ds.removeResource(url, null);
}
//setMessage(msgSequence[0]);
//setLoadingResource(jarSequence[0]);
DownloadServiceListener dsl = ds.getDefaultProgressWindow();
ds.loadResource(url, null, dsl);
}
//take a breath
Thread.currentThread().sleep(3000);
Process exec = Runtime.getRuntime().exec("javaws path/to/your/demo.jnlp");
exec.waitFor();
System.exit(0);
} catch (Exception e) {
System.out.println("Exception: "+e);
}
方法II(简单):
1.清洁简单。引入入口点类“MainClassArgument.java”。
2.将.jnlp文件作为主类指向此类。
3.启动主类的实例,从此类将hardCoded参数传递给主类
因此,使用此方法时,每次要更改参数时都需要重新编译该类。
这会欺骗java web start立即反映您对客户的更改。
希望这会有所帮助:)
注意:问题是您要求禁用java web启动缓存,这不会有帮助,因为 .jnlp文件未缓存,它存储在客户端计算机上。 Java Web Start文档从未提及它在客户端更新.jnlp文件。根据Web启动,更新仅限于资源更新。我们必须找出自己的策略来更新客户端.jnlp文件。