【发布时间】: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();
在终端中打印: 没有 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。