我有一个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();
在终端中打印: 不存在Java运行时,要求安装。
如果我安装JDK,一切正常,但是这里的主要思想是我已经嵌入了JRE,因此用户不必担心这些Java问题并安装它。 所以我的问题是:
答案 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通道作为父进程,而不是创建管道。