これは私の 自分の前の質問 へのフォローアップであり、私はこれを尋ねるのがちょっと恥ずかしいです...しかしとにかく:スタンドアロンJavaプログラムから2番目のJVMをどのように開始しますか?システムに依存しない方法で?たとえば、Java_HOMEなどの環境変数に依存することなく、現在実行中のJREとは異なるJREを指す可能性があります。次のコードを思いつきましたが、実際には機能しますが、少しぎこちない感じがします。
public static void startSecondJVM() throws Exception {
String separator = System.getProperty("file.separator");
String classpath = System.getProperty("Java.class.path");
String path = System.getProperty("Java.home")
+ separator + "bin" + separator + "Java";
ProcessBuilder processBuilder =
new ProcessBuilder(path, "-cp",
classpath,
AnotherClassWithMainMethod.class.getName());
Process process = processBuilder.start();
process.waitFor();
}
また、現在実行中のJVMは、2番目のJVMが認識しない他のいくつかのパラメーター(-D、-X ...、...)で開始された可能性があります。
二次プロセスを開始するときに、常にまったく同じパラメーター、クラスパスなど(特に-Xのようなもの-たとえば、子が親と同じヒープ設定を必要とする理由)を使用する必要があるかどうかは、私にはわかりません。
私は、子のこれらのプロパティを定義するために、ある種の外部構成を使用したいと思います。もう少し手間がかかりますが、最終的には柔軟性が必要になると思います。
可能な構成設定の範囲を確認するには、Eclipseの「実行構成」設定を確認します。そこにはかなりの数のタブの設定が必要です。
答えは「はい」だと思います。 Javaシステムに依存しないコードを使用して行うのと同じくらい良いでしょう。しかし、これは相対的にシステムに依存しないことに注意してください。たとえば、一部のシステムでは:
(2番目の)JVMを起動する際に最大限の移植性を目指していた場合、ラッパースクリプトを使用して実行すると思います。
コードが現在実行されているJava実行可能ファイル(つまり、質問のサンプルコードの「パス」変数)を見つけるには、Apache ant内に役立つユーティリティメソッドがあります。 antを使用してコードをビルドする必要があります-この1つのメソッドでは、ライブラリとして使用するだけです。
それは:
org.Apache.tools.ant.util.JavaEnvUtils.getJreExecutable( "Java")
これは、他のベンダーが言及している、さまざまなJVMベンダーによる一種の特殊なケースを処理します。 (そして、そのソースコードを見ると、想像していたよりも多くの特殊なケースがあります。)
それはant.jarにあります。 antはApacheライセンスの下で配布されているので、手間をかけずにantを好きなように使用できます。