*これ*はJavaコードから2番目のJVMを開始するのに本当に最適な方法ですか?
-
22-07-2019 - |
質問
これは私の以前の質問へのフォローアップです。 :システムに依存しない方法でスタンドアロンJavaプログラムから2番目のJVMをどのように起動しますか?また、たとえばJAVA_HOMEなどのenv変数に依存せずに、現在実行中の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でできることと同じくらい良いでしょう。ただし、これもシステムに依存しない だけであることに注意してください。たとえば、一部のシステムでは:
- JAVA_HOME変数が設定されていない可能性があります
- JVMの起動に使用されるコマンド名が異なる場合(たとえば、Sun JVMでない場合)、または
- コマンドラインオプションは異なる場合があります(たとえば、Sun JVMでない場合)。
(2番目の)JVMの起動で最大限の移植性を目指していた場合、ラッパースクリプトを使用してそれを行うと思います。
コードが現在実行されているjava実行可能ファイル(つまり、質問のサンプルコードの「パス」変数)を見つけるには、Apache ant内で役立つユーティリティメソッドがあります。 antを使用してコードをビルドする必要はありません-この1つの方法では、ライブラリとして使用するだけです。
次のとおりです:
org.apache.tools.ant.util.JavaEnvUtils.getJreExecutable(" java")
これは、他の人が言及したさまざまなJVMベンダーとの特別なケースを処理します。 (そして、そのソースコードを見ると、想像していたよりも特別なケースがあります。)
ant.jarにあります。 antはApacheライセンスの下で配布されているので、手間をかけずに好きなように使用できることを願っています。