从另一个罐子打开罐子

时间:2010-10-27 13:09:17

标签: java memory jar allocation

同样的老问题......我想在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 ”?

------------------------------根据要求编辑,以便更清楚。

1 个答案:

答案 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

然后你将通过

执行这个jar
java -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缓冲区填满时冻结。