Java Web Start 应用程序在 jre8u40 而不是 jre8u51 下运行

Java Web Start application runs under jre8u40 but not jre8u51

我们有一个使用 javaws 的 Java 网络应用程序。它会 运行 在 Java 8 update 40 下正常,但在 Java 8 update 51 jp2launcher.exe 下会停止,而不会启动应用程序。

我在 C:\Users\me\AppData\LocalLow\Sun\Java\Deployment\log 中找到了日志,但它们在 j8u40 和 j8u51 之间是相同的(当然除了加载 jar 的顺序、jre 版本和启动时间)。

我已经使用 Process Monitor 记录了两个 jre 版本的启动。在 j8u51 下,jp2launcher.exe 只是以结果 "SUCCESS" 退出。比较两个 procmon 日志,我无法找出任何异常。他们都翻遍了 C:\Users\me\AppData\LocalLow\Sun\Java\Deployment 目录和他们各自的 C:\Program Files\Java\jre1.8.0_XX\lib 目录等等,但是 j8u51 就退出了。

Windows 事件日志未显示任何 Java 相关内容。

还有其他地方可以查找诊断信息吗?关于这里可能出现的问题有什么建议吗?

更新:我已经设法 运行 使用 set "JAVAWS_VM_ARGS=-Xcheck:jni -XX:-TraceClassLoadingPreorder -XX:+PrintCommandLineFlags -verbose:jni -verbose:class -verbose:gc -XX:+PrintGCDetails -Djava.util.logging.config.file=C:\misc\logging.properties" 的 jnlp 并记录了 stdout/stderr。看起来 javaws 和 jp2launcher 记录到输出,然后 jre8u40 和 jre8u51 版本都终止。据推测,在 j8u40 版本中,它正在启动另一个 jp2launcher.exe 到 运行 应用程序。

比较两个输出日志没有发现任何有趣的东西。 类 以几乎相同的顺序加载,除了一些差异外,大部分相同 类,这些差异很容易通过使用更新的 类 来解释。

进一步更新:我已经能够直接启动应用程序,使用 java.exe,通过从服务器安装和解压缩它们获取客户端文件。应用程序本身运行在jre8u51下没问题,所以问题肯定出在javaws本身。

update3:清除缓存没有解决问题。该问题出现在不同的机器上,即使是全新 Java 安装也是如此。

update4:作为实验,我刚刚在 Ubuntu Linux 下尝试过。我们的产品在技术上不支持 Linux,但我还是想试试。碰巧的是,行为是相同的!在 jre8u40 下应用程序启动,在 jre8u51 下它不启动!

5:原来u45下也有这个问题,就是u40之后的更新。所以,原因似乎是在 u45 中发生了变化,而不是在 u51 中。

知道了!

这里有几个交互元素:

  • jnlp 包含 Java 6 和 Java 7 的 j2se 元素。 Java 8 上的 运行 似乎使用了 Java 6 个条目。
  • Java6 项指定了 VM 参数,而 Java7 项则没有。
  • 经过反复试验,我确定 -XX:+CMSIncrementalMode VM 参数是导致它失败的原因。我不知道这个 arg 是做什么的,但显然 JRE8u45+ 不喜欢它。
  • 我下载并修改了jnlp来测试上面的内容。为了让 javaws 实际使用我的更改,我必须删除根 jnlp 元素的 href 属性。否则,javaws 会忽略我的更改并使用服务器上的 jnlp 副本。

我目前的假设是 JRE8u45+ 有一个错误,它使用了错误版本的 VM 参数。

我刚刚测试了一个包含 1.6、1.7 和 1.8 条目的自定义 jnlp,其中 1.6 有 vm args 而 1.7 和 1.8 没有。

  • Javaws 不会提示“应用程序想要使用 Java 7,但您应该使用系统上最新的版本,可以吗?”。因此,此时已经识别出其中有一个 1.8 条目。
  • 但是,它无法启动该应用程序。因此,在那一点上,它一定对它在哪个 jnlp 元素上感到困惑。

因此,看起来解决方法是从服务器端的 jnlp 中删除 -XX:+CMSIncrementalMode VM arg。