从OSX上的桌面快捷方式加载JavaWS会导致应用程序崩溃

时间:2016-11-10 19:27:09

标签: java macos java-web-start jnlp

**更新11/30

这已被承认为JavaWS错误: http://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8170522

问题

我们似乎在OS X上发现了Java WebStart实现的错误,即webstart应用程序无法通过Desktop.getDesktop()。open(文件文件)API启动外部应用程序。仅当从其桌面快捷方式启动Java WebStart应用程序时才会发生这种情况。有没有人看过这种行为和/或可以建议一种解决方法和/或其他测试渠道?

细节

在OS X平台上,当使用API​​从已签名的Java Webstart应用程序中打开外部应用程序(如Desktop.getDesktop()。open(文件文件)时,外部应用程序加载总是导致该应用程序崩溃时JavaWS应用程序从其桌面快捷方式启动。当直接从JNLP文件或Java控制面板中的缓存启动完全相同的webstart应用程序时,外部应用程序加载时没有问题。在Windows上不会发生此问题。

很容易复制:

  • 使用一个类(下面的Demo类)创建一个简单的项目。这个班 只尝试在RDP文件上打开所有Desktop.getDesktop()。
  • 捆绑成一个罐子和标志(自我标志好)(下面的蚂蚁脚本)
  • 创建一个简单的jnlp文件(下面的示例)
  • 将jar和jnlp部署到通过https
  • 访问的网络服务器
  • 将网络服务器的域添加到Java的例外列表中,以便自签名的应用程序可以运行

在OS X客户端计算机上进行如下测试:

  • 安装最新的Microsoft远程桌面应用程序(v8.0.35) - 确保RDP文件与此应用程序相关联
  • 确保RDP客户端已关闭
  • 从上传到上面的网络服务器下载/运行jnlp文件
  • JavaWS应用程序将打开并成功打开RDP客户端并加载RDP文件
  • 确保关闭RDP客户端和演示应用
  • 从桌面图标&lt; ===加载演示应用程序<= li>这是失败案例
  • RDP客户端将开始打开然后崩溃
  • 确保关闭RDP客户端和演示应用
  • 从java缓存加载应用程序&lt; ===这应该与从桌面图标加载
  • 具有相同的行为
  • 应用程序将打开并成功打开RDP客户端并加载RDP文件

在应用程序发出的任何可以打开另一个应用程序的命令中观察到相同的行为,即这不仅仅是在RDP文件/应用程序中看到...当从桌面快捷方式加载JavaWS应用程序时,每个机制我们试过了。

直接从JNLP加载或从Java控制面板中的Java缓存加载时,完全相同的代码可以正常工作。代码中没有出现错误或警告,因此看起来外部命令已成功发出,但JVM与操作系统交互的方式在两种情况下必须不同。

有人可以建议在从桌面快捷方式加载时改变webstart应用程序的行为可以做些什么,并使Windows和OS X体验保持一致?

要复制问题的文件如下:

使用open命令演示类:

package com.example;

import java.awt.*;
import java.io.File;
import java.util.logging.Logger;

public enum Demo {

   INSTANCE;

  private static final Logger log = Logger.getLogger(Demo.class.getName());

  public static void main(String[] args) {
  Demo demo = Demo.INSTANCE;
   String filename = System.getProperty("user.home")
  + System.getProperty("file.separator")
  + "test.rdp";
   log.info("opening file: " + filename);
   demo.openFile(new File(filename));
   }

   public void openFile(File file) {
   log.info("Desktop.getDesktop().open(" + file.getAbsolutePath() + ")");
  try {
   if (file.exists()) {
  Desktop.getDesktop().open(file);
   } else {
   log.info("Cannot open file " + file.getAbsolutePath() + " does not exist.");
   }
  } catch (Exception e) {
  e.printStackTrace();
   }
  }

}

演示JNLP文件:

<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="6.0+"
   codebase="https://yourwebserver.example.com/path/to/app"
   href="OpenDemo.jnlp" >
  <information>
  <title>Open Demo</title>
  <vendor>Example</vendor>
  <shortcut online="true" install="true">
  <desktop/>
  </shortcut>
  <update check="timeout" policy="always"/>
  </information>
  <security>
  <all-permissions/>
  </security>
  <resources>
  <java version="1.8+" />
  <jar href="./OpenDemo.jar" main="true" />
  </resources>
  <application-desc
   main-class="com.example.Demo" />
</jnlp>

ANT构建文件:

<?xml version="1.0" encoding="UTF-8"?>
<project name="Build Open Demo WebStart Application">

  <property name="compiled.basedir" value="../out/production/demo-webstart-app/" />
  <property name="target.jarname" value="OpenDemo.jar" />

   <!-- default the target to be 1.8 -->
   <property name="ant.build.javac.target" value="1.8" />
  <property name="ant.build.javac.source" value="1.8" />

   <!-- bundle the jar -->
   <target name="bundle">
  <jar destfile="../${target.jarname}"
   filesetmanifest="mergewithoutmain"
   basedir="${compiled.basedir}" >

  <include name="com/example/**" />
  <manifest>
  <attribute name="Application-Name" value="OpenDemo" />
  <attribute name="Codebase" value="*" />
  <attribute name="Permissions" value="all-permissions" />
  <attribute name="Caller-Allowable-Codebase" value="*" />
  <attribute name="Entry-Point" value="com.example.Demo" />
  <attribute name="Trusted-Only" value="true" />
  </manifest>
  </jar>
  </target>


   <!-- sign what we have bundled with a self signed CA -->
  <!-- cert created using:
  keytool -genkey -keyalg RSA -alias selfsigned -keystore keystore -storepass opendemo -validity 30 -keysize 2048

  What is your first and last name?
  [Unknown]: OpenDemo
  What is the name of your organizational unit?
  [Unknown]: OpenDemo
  What is the name of your organization?
  [Unknown]: OpenDemo
  What is the name of your City or Locality?
  [Unknown]: OpenDemo
  What is the name of your State or Province?
  [Unknown]: OpenDemo
  What is the two-letter country code for this unit?
  [Unknown]: OD
  Is CN=OpenDemo, OU=OpenDemo, O=OpenDemo, L=OpenDemo, ST=OpenDemo, C=OD correct?
  [no]: yes

  Enter key password for <selfsigned>
  (RETURN if same as keystore password):
  -->
   <target name="sign" depends="bundle">

  <signjar
   jar="../${target.jarname}"
   lazy="false"
   alias="selfsigned"
   keystore="../keystore"
   storepass="opendemo"
   />
  </target>

</project>

1 个答案:

答案 0 :(得分:0)

问题特定于Mac上的远程桌面应用程序。 RemoteDesktop客户端崩溃而不是生成它的java进程。原因尚不清楚。

在Windows上远程桌面是从Web启动,缓存查看器启动或快捷方式启动启动的,MAC也是如此。但是,它在MAC上的桌面快捷方式案例中崩溃,随后是崩溃对话框,显示详细信息,退出(确定)或重新打开的选项。

解决方法:选择重新打开此对话框,远程桌面就可以了。