【问题标题】:FileNotFoundException starting 1.4.2 webstart application with java webstart 1.6 over HTTPSFileNotFoundException 通过 HTTPS 使用 java webstart 1.6 启动 1.4.2 webstart 应用程序
【发布时间】:2012-09-14 09:41:49
【问题描述】:

非常感谢所有愿意花时间阅读的人。

我正在努力制作一个 webstart Swing 1.4.2_12 应用程序以使用 java webstart 1.6.0_29 启动。

这里是场景:

  1. 所有流量都通过 HTTPS 完成
  2. 用户单击网页上的链接以启动应用程序:servlet 生成的jnlp文件
  3. Java webstart 客户端 (1.6.0_29) 启动并加载应用程序 一口气
  4. 因为jnlp描述符java中j2se版本设置为1.4.2_12 webstart 1.4.2_12 用于启动应用程序(由 1.6.0_29)
  5. Java webstart 1.4.2_12 启动失败,声称找不到某些幽灵“javaws2”文件

报告以下消息:

CouldNotLoadArgumentException[ Could not load specified file/URL : C:\DOCUME~1\BENOIT~1.VAT\LOCALS~1\Temp\javaws2]
    at com.sun.javaws.Main.launchApp(Unknown Source)
    at com.sun.javaws.Main.continueInSecureThread(Unknown Source)
    at com.sun.javaws.Main$1.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

完整的堆栈跟踪是:

java.io.FileNotFoundException: C:\DOCUME~1\BENOIT~1.VAT\LOCALS~1\Temp\javaws2 (File not found)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(Unknown Source)
    at java.io.FileInputStream.<init>(Unknown Source)
    at com.sun.javaws.jnl.LaunchDescFactory.buildDescriptor(Unknown Source)
    at com.sun.javaws.Main.launchApp(Unknown Source)
    at com.sun.javaws.Main.continueInSecureThread(Unknown Source)
    at com.sun.javaws.Main$1.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
  • 禁用 HTTPS 时也会出现同样的错误。

以下两个 HTTP 标头均由 JNLP servlet 发送到客户端:

Cache-Control:空
Pragma:空

这些标头是防止 IE 在 HTTPS 模式下禁用缓存所必需的,这会阻止 java webstart 找到加载的 jnlp 文件(因为它没有被缓存)。

  • Mime-type 设置为:application/x-java-jnlp-file

  • 我不明白的是为什么java 1.4.2_12找不到JWS 1.6.0_29加载的jnlp文件?

感谢阅读。

【问题讨论】:

  • 为什么应用程序。使用过时 JRE 的过时版本? JNLP 中如何指定 JRE?您是否收到有关在旧 JRE 中运行代码的警告?应用程序。在较新的 JRE 中工作(达到测试的极限)?
  • 3 分中有 2 分还不错,但 4 分中有 0 分很糟糕。 :(
  • @AndrewThompson 感谢您的回复。该应用程序使用过时的 JRE,因为它是 10 多年的遗留应用程序。并且与 1.5/1.6 JRE 不兼容,某些功能已损坏。更重要的是,重新测试整个应用程序是不可能的。所以我们不能考虑迁移到 1.5/1.6。因此,我们在 JNLP 描述符中声明 ** ** 以指示 JWS 切换到 1.4.2_12。我目前正在对问题进行深入分析,最终将在此处发布我的结果。到目前为止,我怀疑根 标记的空 href 属性是导致该问题的原因。

标签: java https jnlp java-web-start


【解决方案1】:

@Andrew:感谢您的关注。

我对这个问题的结论如下。

简而言之:始终在 jnlp 标记中设置 href 属性!

<jnlp spec="1.0+" codebase="htt://myhost/codebase" href="mustSetThisAbsolutelyForJWS-1.4.2_12.jnlp">
...
</jnlp>

多个 HTTP 调试会话表明:

场景 1:href 属性留空,JNLP 文件与客户端上的 JWS 1.6 关联

  1. 用户点击 jnlp 链接,JNLP 文件被下载并缓存 浏览器。
  2. JWS 1.6.0_29 启动,然后读取下载的 JNLP 文件。
  3. JWS 1.6.0_29 下载所有 JAR 文件,然后切换到 JWS 1.4.2_12。
  4. JWS 1.4.2_12 启动,然后显然会依次读取 JNLP 文件。
  5. JWS 1.4.2_12 尝试检索 href 指向的 JNLP 文件 属性。
  6. 由于 href 为空,JWS 报告“无法加载指定的文件/URL : C:\DOCUME~1\BENOIT~1.VAT\LOCALS~1\Temp\javaws2"。(附带说明一下,ghost javaws2 有时被命名为 javaws10 或类似名称)

请注意:在这种情况下使用 JWS 1.4 或 1.5 时, 应用程序将启动。该问题仅在使用 JWS 1.6 时出现 运行 1.4.2_12 应用程序。 JWS 1.5 和 1.6 没有失败时不会失败 设置了 href 属性。相反,他们只是按原样使用 JNLP,检查 JAR 更新,然后启动应用程序。

场景 2:href 属性设置为适当的值,并且 JNLP 文件与客户端上的 JWS 1.6 相关联

  1. 用户点击 jnlp 链接,JNLP 文件被下载并缓存 浏览器。
  2. JWS 1.6.0_29 启动,然后读取下载的 JNLP 文件。
  3. JWS 1.6.0_29 下载所有 JAR 文件,然后切换到 JWS 1.4.2_12。
  4. JWS 1.4.2_12 启动,然后显然会依次读取 JNLP 文件。
  5. JWS 1.4.2_12 尝试检索 href 指向的 JNLP 文件 属性。
  6. JWS 1.4.2_12 下载 href 属性指向的 JNLP。
  7. JWS 1.4.2_12 下载新下载的 JNLP 文件中引用的所有 JNLP JAR 文件
  8. JWS 1.4.2_12 可以正确启动应用程序。

这对我来说是一个严重的颈部疼痛,我花了几天时间才弄清楚这一点。希望有一天这会对某人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2014-02-25
    • 1970-01-01
    • 2010-11-22
    相关资源
    最近更新 更多