同样的老问题......我想在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 ”?
------------------------------根据要求编辑,以便更清楚。
答案 0 :(得分:2)
您可以使用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
然后你将通过
执行这个jarjava -jar MyJar.jar
或通过文件关联(双击)。
当它运行时,它执行命令java -Xmx512M -cp MyJar.jar Main
,它运行jar的Main类的main方法。在两次调用中使用相同的jar:第一次通过清单文件自动运行AppLauncher.main()
,第二次通过显式进程调用Main.main()
运行。
当然,这仍然很脆弱。首先,它假定工作目录设置为包含jar文件的文件夹。这并非总是如此。
编辑:如果您不相信其他情况,并且实际采用ProcessBuilder路线,那么它不仅仅是我所说的。 There are pitfalls to avoid。例如,我没有从进程的输出流中读取(使用Process.getInputStream()
),因此如果子Java进程向stdout输出任何内容,它将在OS缓冲区填满时冻结。