【问题标题】:Java - Mac application requires JDK to be installed in order to runJava - Mac 应用程序需要安装 JDK 才能运行
【发布时间】:2019-05-31 15:33:25
【问题描述】:

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

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

Mac 中总是出现以下错误:

在终端中打印: 没有 Java 运行时,正在请求安装。

如果我安装 JDK,一切都会很好,但这里的主要想法是我已经嵌入了 JRE,所以用户不会担心那些 Java 问题并安装它。 所以我的问题是:

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

【问题讨论】:

  • 我假设第一个 jar 运行是因为一些直接调用嵌入式 JRE 二进制文件的本机脚本?在这种情况下,您不能为另一个 jar 提供第二个脚本,或者如果您必须从第一个 jar 中使用它,则将其用作库?您也可以尝试从嵌入式 JRE 的相对路径运行您的进程(因此操作系统不会尝试让用户安装另一个),但我觉得这不是最好的主意......
  • 没错。 Mac .app 文件有一个脚本来运行一个 Jar 文件,这是我的第一个 Jar。我需要从 Jar 1 运行 Jar 2 以将许多参数传递给 Jar 2,例如要使用的内存值:-Xms 和 -Xmx。
  • 请问Java是什么版本的?
  • 至少需要 Java 1.8 ...
  • 也许,它解析为不同的java 可执行文件。尝试使用显式路径,即Paths.get(System.getProperty("java.home"), "bin", "java").toString() 而不仅仅是"java"。而且不要使用-noverify

标签: java macos java-8 jar


【解决方案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,因此新进程将使用相同的输入/输出通道父进程,而不是创建管道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 2013-01-04
    相关资源
    最近更新 更多