Java Web Start应用程序在jre8u40下运行,但不在jre8u51下运行

时间:2015-07-22 07:13:45

标签: java java-web-start

我们有一个使用javaws的Java Web应用程序。它将在Java 8更新40下运行正常,但在Java 8更新51下,jp2launcher.exe只是停止,而不启动应用程序。

我在C:\ Users \ me \ AppData \ LocalLow \ Sun \ Java \ Deployment \ log中找到了日志,但它们在j8u40和j8u51之间是相同的(当然除了加载了订单罐,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中发生了变化。

1 个答案:

答案 0 :(得分:0)

知道了!

这里有一些互动元素:

  • jnlp包含Java 6和Java 7的j2se元素。在Java 8上运行,它似乎使用Java 6条目。
  • Java 6条目指定VM参数,而Java 7条目不指定。
  • 经过反复试验,我确定-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。