同样的老问题...我想在具有高内存分配的 Mac 或 Linux 上运行我的 jar。我不希望用户打开终端并手动编写 java -XMx512 -jar MainJar.jar 。
我已经看到了很多解决这个问题的解决方案......但我想知道这是否可行:“在 Jar 中执行终端命令 java -XMx512 -jar MainJar.jar (B) 使用 512 MB 内存分配来初始化 Jar(A)。”。
在 Jar(B) 中,我尝试使用此代码来运行 Jar(A) 并且运行良好:
public static void main(String[] args) throws Exception{
String jarName = "MainJar.jar"; // Jar(A) name.
Desktop.getDesktop().open( new File( jarName ) );
}
但是当从 Jar(B) 初始化时,我仍然没有为 Jar(A) 分配内存,所以我可以在 Jar(B) 中编写代码来运行终端并为其提供执行命令: “java -XMx512 -jar MainJar.jar”?
------------------------------ 根据要求进行编辑,以使其更加清晰。
最佳答案
您可以使用Runtime.exec()
或 ProcessBuilder 来完成此操作。
Process proc = new ProcessBuilder("java", "-XMx512M", "-jar", "MainJar.jar").start();
int result = proc.waitFor();
但说实话,我认为这是一个糟糕的解决方案。我更喜欢像InstallAnywhere 这样的安装包。如果失败,我将使用 shell 脚本来启动 Jar。将其封装在无法编辑的 Jar 中会让用户感到厌烦,而且现在您拥有并行依赖项而不是单个文件。
如果您打算采用此路线,则可以将同一个 Jar 用于这两个目的。将要使用正确参数启动的类文件添加到 Jar 中,例如 AppLauncher.class
。我们假设您的程序的真实代码从 Main.class
开始。 。
public class AppLauncher {
public static void main(String... args) {
Process proc = new ProcessBuilder("java", "-XMx512M", "-cp", "MyJar.jar", "Main").start();
int result = proc.waitFor();
}
}
那么你会have your Manifest file of the jar point to this main class :
Main-Class: AppLauncher
然后你可以通过执行这个jar
java -jar MyJar.jar
或通过文件关联(双击)。
当它运行时,它会执行命令java -Xmx512M -cp MyJar.jar Main
它运行 jar 的 Main 类的 main 方法。两次调用中使用相同的 jar:第一次自动运行 AppLauncher.main()
第二次通过 list 文件Main.main()
通过显式进程调用。
当然,这仍然很脆弱。一方面,它假设工作目录设置为包含 jar 文件的文件夹。但这并不总是正确的。
编辑:以防万一您不相信要这样做,并实际采用 ProcessBuilder 路线,它的内容不仅仅是我所提到的。 There are pitfalls to avoid 。例如,我没有从进程的输出流中读取数据(使用 Process.getInputStream()
),因此如果子 Java 进程向 stdout 输出任何内容,则当操作系统缓冲区填满时,它将卡住。
关于java - 从另一个 jar 打开 jar ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4033555/