【问题标题】:Java on OS X: "open" command won't run if .app package contains a JVM bundleOS X 上的 Java:如果 .app 包包含 JVM 包,“open”命令将不会运行
【发布时间】:2016-08-10 03:16:44
【问题描述】:

我正在尝试从 Java 应用程序创建一个独立的 Mac 应用程序。我已经设置了 .app 目录,配置了 Info.plist 文件,烘焙了依赖项以及 Java 运行时。我成功地打开了 .app 并启动​​了程序,除了一段特殊的代码外,一切正常:

ProcessBuilder pb = new ProcessBuilder("open", "/Applications/TextEdit.app");
pb.start();

当我启动 .app 时,此代码确实似乎运行或至少做任何事情。如果我打开包内容并启动 .jar,它运行良好。我设法将其缩小到仅在 .app 包含 Java 运行时包时才发生。由于运行 .jar 使用系统的 Java,运行 .app 使用捆绑的 Java,这一定是我苦苦挣扎的原因。

我的 Mac 安装的 Java JDK 的版本应该是 1.8.0_77。 捆绑的版本应该是 1.8.0_74。我从Moneydance 应用程序中获取了它,因为我在制作.app 时将其用作参考。

非常感谢任何帮助,因为这应该是发布它的最后一步。我创建这个问题比我的其他问题here 更具体。

【问题讨论】:

  • 看看两个JVM下PATH环境变量的打印会很有趣。
  • @RealSkeptic 似乎两者都输出/usr/bin:/bin:/usr/sbin:/sbin的相同PATH
  • 好的,那么接下来要做的就是告诉我们进程的确切退出代码是什么,如果它不为零,给我们错误流的内容。
  • 我目前没有从我的工作站(而是一个 Mac 虚拟机)运行它,所以我在工具方面有点障碍。获取此信息的最简单方法是什么?如果我从包中运行 unix 可执行文件,我会得到一个终端日志窗口,它不会提示任何错误。当我单击虚拟应用程序中的按钮时,它只会在标题栏中短暂显示jspawnhelper(尽管我猜这无关紧要)。如果需要的话,我会在几个小时后回到我的电脑前,只是想用我同时拥有的东西来解决这个问题。
  • 我的意思是您必须更改该 Java 应用程序,以便它将该信息打印到日志中 - 它应该具有获取流程结果并读取流程错误流的内容,否则该信息丢失了。请注意,为了让我们能够帮助您,您的问题应包括相关代码,最好以minimal reproducible example 的形式。没有人会运行未知人下载的 zip,这违反了 StackOverflow 规则(请参阅 help center)。

标签: java macos jar .app


【解决方案1】:

所以我会自己回答这个问题,因为这个问题有点在我这边。

我使用的捆绑 JVM(我从 Moneydance 应用程序复制的)是罪魁祸首。我怀疑 Moneydance 的创建者可能已经剥离了他们的应用程序不使用的运行时功能包以减小文件大小。不管是什么原因,我的问题是通过创建自己的包来解决的。

我通过将/Library/Java/JavaVirtualMachines/jdk1.8.0_77.jdk 复制到MyApp.app/Contents/PlugIns/ 来做到这一点。之后,我编辑了名为JVMRuntimeInfo.plist 键以使用条目jdk1.8.0_77.jdk。我的应用程序现在使用这个 JDK 而不是我以前的包,open 现在可以正常工作了。

很抱歉没有做功课,但感谢帮助的人。我在编写复制步骤时发现了这个问题,所以没有你我可能找不到它。我想我能对那些可能遇到类似情况的人说的就是检查你的 JVM 包。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-10
  • 2011-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 2013-10-26
相关资源
最近更新 更多