我有 2 个 jar 文件。我希望 Jar A 打开 Jar B 然后让 jar A 终止,让 Jar B 运行。我该怎么做呢?
编辑:我的意思是我希望 JarA 在 JVM 的一个实例中打开,然后我希望 JarA 在 JVM 的新实例中执行 JarB,然后 JarA 使用 system.exit(0)
是否要启动一个新的 JVM 实例来运行另一个 Jar,然后终止?这并不常见。
或者,您可以只将 Jar B 包含到类路径中,并使用它在 Jar A 中的代码中提供的类。
要启动一个新的 JVM,你可以java
像任何其他操作系统命令一样启动外部进程,查看ProcessBuilder上的文档
ProcessBuilder pb = new ProcessBuilder("java", "-classpath", "B.jar", "B.BMain");
Process p = pb.start();
在 Java 中启动外部进程有很多注意事项,你会在这里找到很多关于 SO 搜索Process
和ProcessBuilder
jar
文件不运行或终止;也就是说jvm
,例如由命令启动java
。例如,当您运行以下命令时:
java -classpath A.jar A.Main
一个新jvm
的启动并执行main
该类的方法A.Main
现在该方法Main.main()
,可以调用类的方法B.jar
,如果它在类路径中。例如,如果命令是
java -classpath A.jar;B.jar pkg.A
然后A.Main.main
里面可以
B.SomeClass.SomeMethod()
B
在哪里B.jar
当您说“打开 B.jar”时,这就是您的意思吗?请注意,这不会“关闭”另一个“A.jar”,无论这可能意味着什么。
假设,即使在阅读了以下答案之后,您仍然想在未附加到父进程“JAR-A”的单独 JVM 进程中调用“JAR-B”,那么最好的选择可能是使用类似于“cmd / start”(对于 Windows)或使用 'sh ... &'(对于 *nix)(来自 JAR-A 中的 java 程序)
我有一个可能的部分答案:
因此,如果您在 Windows 上使用 Java,那么您可以使用
new ProcessBuilder("java", "-classpath", "B.jar", "B.Main").inheritIO().start();
这不仅会启动进程,还会在同一个命令提示符窗口中启动它。要退出 JAR A,请System.exit(0);
在创建进程 B 后立即在 JAR A 的 main 方法中包含 a。
对于 Linux 版本,我不太确定,因为我的程序遇到了相同/类似的问题。
编辑:我确实在我的上述问题中发布了我的答案。:)