gpt4 book ai didi

java - 从另一个 jar 打开 jar

转载 作者:行者123 更新时间:2023-12-02 08:28:08 25 4
gpt4 key购买 nike

同样的老问题...我想在具有高内存分配的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com