2つのjarファイルがあります。JarAでJarBを開き、Jar Aを終了させて、JarBを実行したままにします。どうすればこれを行うことができますか?
編集:JVMの1つのインスタンスでJarAを開き、JVMの新しいインスタンスでJarBを実行し、JarAがsystem.exit(0)を使用することを意味しました
他のJarを実行するために新しいJVMインスタンスを起動してから、終了しますか?これはそれほど一般的ではありません。
または、Jar Bをクラスパスに含めて、JarAのコード内からJarBが提供するクラスを使用することもできます。
新しいJVMを開始するにはjava
、他のOSコマンドと同じように外部プロセスを開始します。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
newjvm
が開始され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を作成した直後にJARAのmainメソッドにaを含めます。
Linuxビルドの場合、プログラムで同じ/類似の問題が発生しているため、よくわかりません。
Javaで新しいプロセスを作成し、現在のプロセスを終了します
編集:私は私の上記の質問に私の答えを投稿しました。:)