首页 文章

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

提问于
浏览
0

我试图禁止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 回答

  • 0

    Java Web Start永远不会更新客户端计算机上的JNLP文件内容 . 但是,如果任何资源更新,它的性能将完美无瑕 .

    例如 :

    如果您在服务器上托管的jnlp文件中注释了一个helper.jar资源 . 在对服务器的.jnlp进行更改之前,web start并未将此更改反映到已下载jnlp文件的任何客户端 .

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

    但是,如果您完全删除了您所评论的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文件 .

    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);
    }
    

    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文件 .

相关问题