java - 从另一个 jar 打开 jar

标签 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”?

------------------------------ 根据要求进行编辑,以使其更加清晰。

最佳答案

您可以使用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/

相关文章:

java - 客户端-服务器程序的主方法中的参数错误

c - main 的所有命令行参数

java - 将 Proguard 与可运行的 JAR 文件结合使用

java - 错误: Could not find or load main class while executing jar file

java - 在Java中对二维字符串数组进行排序

java - 如何添加 html 标签但仍保持空格不变?

JAVAFX:setMaxWidth() 和 maxWidthProperty().set() 之间的区别

ios - 如何在音频单元扩展(实时进程)中为音频文件播放分配内存?

android - Android Activity中静态final的使用

ubuntu - 错误 : Unable to access jarfile when running docker container