*これ*はJavaコードから2番目のJVMを開始するのに本当に最適な方法ですか?

StackOverflow https://stackoverflow.com/questions/1229605

  •  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でできることと同じくらい良いでしょう。ただし、これもシステムに依存しない だけであることに注意してください。たとえば、一部のシステムでは:

  1. JAVA_HOME変数が設定されていない可能性があります
  2. JVMの起動に使用されるコマンド名が異なる場合(たとえば、Sun JVMでない場合)、または
  3. コマンドラインオプションは異なる場合があります(たとえば、Sun JVMでない場合)。

(2番目の)JVMの起動で最大限の移植性を目指していた場合、ラッパースクリプトを使用してそれを行うと思います。

コードが現在実行されているjava実行可能ファイル(つまり、質問のサンプルコードの「パス」変数)を見つけるには、Apache ant内で役立つユーティリティメソッドがあります。 antを使用してコードをビルドする必要はありません-この1つの方法では、ライブラリとして使用するだけです。

次のとおりです:

org.apache.tools.ant.util.JavaEnvUtils.getJreExecutable(" java")

これは、他の人が言及したさまざまなJVMベンダーとの特別なケースを処理します。 (そして、そのソースコードを見ると、想像していたよりも特別なケースがあります。)

ant.jarにあります。 antはApacheライセンスの下で配布されているので、手間をかけずに好きなように使用できることを願っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top