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

时间:2017-03-29 15:35:01

标签: java java-web-start jnlp

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

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

正确的方法是什么:

  1. 禁用JNLP文件缓存
  2. 强制它始终更新JNLP文件
  3. 每次JNLP启动时正确传递不同的参数
  4. 这是我的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 个答案:

答案 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文件。