【问题标题】:How do I execute a Jar file in a new process and close the original Jar?如何在新进程中执行 Jar 文件并关闭原始 Jar?
【发布时间】:2013-01-03 02:05:35
【问题描述】:

我有 2 个 jar 文件。我希望 Jar A 打开 Jar B 然后让 jar A 终止,让 Jar B 运行。我该怎么做呢?

编辑:我的意思是我希望 JarA 在 JVM 的一个实例中打开,然后我希望 JarA 在 JVM 的新实例中执行 JarB,然后 JarA 使用 system.exit(0)

【问题讨论】:

  • By "close the original Jar?" ITYM 关闭运行该 Jar 的 JVM。但我更喜欢@gd1 的“类路径”策略。

标签: java jar runtime execution terminate


【解决方案1】:

要启动一个新的 JVM,您可以像任何其他操作系统命令一样启动外部 java 进程,请查看 ProcessBuilder 上的文档

 ProcessBuilder pb = new ProcessBuilder("java", "-classpath", "B.jar", "B.BMain");
 Process p = pb.start();

在 Java 中启动外部进程有很多注意事项,你会在这里找到很多关于 SO 搜索 ProcessProcessBuilder 的材料


jar 文件不运行或终止;那是jvm,例如由命令java 启动。例如,当您运行以下命令时:

java -classpath A.jar A.Main

一个新的jvm被启动并执行A.Main类的main方法

现在Main.main() 方法,可以调用B.jar 中的类的方法,如果它在类路径中的话。例如,如果命令是

java -classpath A.jar;B.jar pkg.A

那么在A.Main.main里面就可以有

 B.SomeClass.SomeMethod()

BB.jar 中的位置

这就是你所说的“打开 B.jar”的意思吗?请注意,这不会“关闭”另一个“A.jar”,无论这可能意味着什么。

【讨论】:

  • 我的意思是我希望 JarA 在一个 JVM 实例中打开,然后我希望 JarA 在一个新的 JVM 实例中执行 JarB 然后 JarA 使用 system.exit(0)
【解决方案2】:

您想启动一个新的 JVM 实例来运行另一个 Jar,然后终止吗?这并不常见。

或者,您可以只将 Jar B 包含到类路径中,并使用它在 Jar A 中的代码中提供的类。

【讨论】:

    【解决方案3】:

    假设,即使在阅读了以下答案之后,您仍想在未附加到父进程“JAR-A”的单独 JVM 进程中调用“JAR-B”,那么最好的选择可能是使用类似于“cmd /start”(适用于 windows)或使用 'sh ... &'(适用于 *nix)(来自 JAR-A 中的 java 程序)

    【讨论】:

      【解决方案4】:

      我有一个可能的部分答案:

      因此,如果您在 Windows 上使用 Java,那么您可以使用 new ProcessBuilder("java", "-classpath", "B.jar", "B.Main").inheritIO().start();

      这不仅会启动进程,还会在同一个命令提示符窗口中启动它。要退出 JAR A,请在创建进程 B 后立即在 JAR A 的 main 方法中包含 System.exit(0);

      对于 Linux 版本,我不太确定,因为我的程序遇到了相同/相似的问题。

      Create a new process in Java, exit the current process

      编辑:我确实在我的上述问题中发布了我的答案。 :)

      【讨论】:

        猜你喜欢
        • 2011-10-07
        • 1970-01-01
        • 2014-12-31
        • 1970-01-01
        • 1970-01-01
        • 2014-08-16
        • 2013-02-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多