Java-Mac应用程序需要安装JDK才能运行

时间:2019-05-31 15:33:25

标签: java macos java-8 jar

我有一个Java应用程序,它在Mac OS X上运行(捆绑在.app文件中),其中包含2个Jar文件。一个Jar运行另一个Jar来传递一些变量参数。 我还在应用程序中嵌入了JRE,因此用户完全不必担心下载Java。问题是,当用户运行应用程序时, 使用嵌入式JRE,第一个Jar可以正常运行,但是当它尝试通过以下示例代码运行第二个Jar时:

String jarPath = "MyMainJar.jar"
String [] cmd = { "java", "-jar", "-noverify", jarPath };
ProcessBuilder processBuilder = new ProcessBuilder( cmd );
Process process = processBuilder.start();

以下错误始终在Mac中出现: Mac Java App requires JDK

在终端中打印: 不存在Java运行时,要求安装。

如果我安装JDK,一切正常,但是这里的主要思想是我已经嵌入了JRE,因此用户不必担心这些Java问题并安装它。 所以我的问题是:

  • 我的嵌入式JRE在“ bin”文件夹中具有“ java”工具。为什么第一个Jar无法使用它?为什么它坚持要拥有JDK?
  • 我可以在应用程序中嵌入JDK而不是JRE吗?
  • 我可以在Mac OS消息向用户显示之前在我的代码中检测到此问题,以便向他显示更好的消息吗?
  • 还有其他建议的解决方案可以解决此问题,而无需要求用户在Mac上安装JDK吗?

1 个答案:

答案 0 :(得分:1)

如果您指定java时没有绝对路径,则可能通过系统特定的命令搜索路径来解析它最终会出现在其他Java安装程序的可执行文件中。

要强制使用您已经在运行的同一JVM,请针对java.home系统属性来解析该命令。

String jarPath = "MyMainJar.jar";
String jarCmd = Paths.get(System.getProperty("java.home"), "bin", "java").toString();
String [] cmd = { jarCmd, "-jar", jarPath };
ProcessBuilder processBuilder = new ProcessBuilder(cmd);
Process process = processBuilder.start();

请注意,请勿使用-noverify。如果有一些选择,这种选择的好处并不能证明其风险。

此外,如果您不打算将构造的输入提供给新流程或解析其输出,则值得将.inheritIO()链接到ProcessBuilder,因此新流程将使用相同的输入/ output通道作为父进程,而不是创建管道。