JNLP 文件未针对不同的参数进行更新



我在JNLP文件上遇到了几个问题。我正在尝试禁用 Java 缓存 JNLP 文件,因为每次运行它时,我都会向它传递不同的<argument>......但是,我似乎无法强制它使用<update check="always" policy="always"/>进行自我更新。我还尝试在 http 响应标头中设置Last-Modified属性,但这也不起作用。

jar 保持不变,所以我也不能真正使用version属性来强制它更新......

正确的方法是什么:

  1. 禁用 JNLP 文件高速缓存
  2. 强制它始终更新 JNLP 文件
  3. 每次启动 JNLP 时正确传递不同的参数

这是我的JNLP文件,请注意,无论何时从Web浏览器启动,<argument>都可能不同,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>

Java Web start 从不更新客户端计算机上的 JNLP 文件内容。但是,如果更新任何资源,它的性能将完美无缺。

例如:

如果注释了服务器上托管的 JNLP 文件中的帮助程序.jar资源。Web Start 不会将此更改反映到在对服务器的 .jnlp 进行更改之前已下载 JNLP 文件的任何客户端。

<!--jar href="helper.jar"/-->

但是,如果您完全删除 jar 文件拥有的类的引用,则您注释并重新编译了所有资源并重新部署了它们。此时,Java Web 启动意外地变得主动,并反映您在服务器上所做的所有更改。

说到你的观点:你正在改变你的.jnlp文件,这意味着由于一些神秘的原因,你的改变不会反映给客户。

溶液:

方法一(复杂):

您必须以某种方式在任何罐子中反映您的更改,以便 web start 可以拾取它们。这是一个粗略的草图:

1.创建一个新类作为应用程序的入口点。

2.In 此类,请检查服务器的 .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);
}

方法二(简单):

1.干净简洁。引入一个入口点类,比如"MainClassArgument.java"。

2.将 .jnlp 文件作为主类指向此类。

3.启动主类的实例,从这个类将硬编码参数传递给你的主类

所以使用这种方法,每次要更改参数时都需要重新编译类。

这将欺骗 java Web 开始立即将您的更改反映到客户端。

希望这对:)有所帮助

注意:在问题中,您要求禁用java web启动缓存,这将无济于事,因为.jnlp文件没有缓存,而是存储在客户端计算机上。Java Web启动文档从未提到它在客户端更新.jnlp文件。根据web启动,更新只限于资源更新,没有别的。我们必须找出自己的策略来更新客户端 .jnlp 文件。

最新更新