スタンドアロンの Java プログラムから Java コマンドを呼び出す方法を教えてください。
Runtime.getRuntime().exec("cmd c/ javac <>.java"); を理解しています。動作します。ただし、これはプラットフォーム固有です。
j2sdk1.4 で動作させることができる他の API はありますか?
スタンドアロンの Java プログラムから Java コマンドを呼び出す方法を教えてください。
Runtime.getRuntime().exec("cmd c/ javac <>.java"); を理解しています。動作します。ただし、これはプラットフォーム固有です。
j2sdk1.4 で動作させることができる他の API はありますか?
すべてを同じ JVM で実行できる場合は、次のようにすることができます。
public class Launcher {
...
public static void main(String[] args) throws Exception {
launch(Class.forName(args[0]), programArgs(args, 1));
}
protected static void launch(Class program, String[] args) throws Exception {
Method main = program.getMethod("main", new Class[]{String[].class});
main.invoke(null, new Object[]{args});
}
protected static String[] programArgs(String[] sourceArgs, int n) {
String[] destArgs = new String[sourceArgs.length - n];
System.arraycopy(sourceArgs, n, destArgs, 0, destArgs.length);
return destArgs;
}
そして、次のようなコマンド ラインで実行します。
java Launcher OtherClassWithMainMethod %CMD_LINE_ARGS%
Runtime.getRuntime().exec() の呼び出しはプラットフォーム固有であるだけでなく、非常に非効率的です。これにより、まったく新しいシェルと jvm 全体が生成され、このアプリケーションの依存関係によっては非常に高価になる可能性があります (しゃれは意図されていません)。
「外部」Java コードを実行する最善の方法は、それを CLASSPATH に配置することです。アプリケーションのメイン メソッドを呼び出す必要がある場合は、メソッドを直接インポートして呼び出すことができます。これは次のように実行できます。
import my.externals.SomeMain
// call as if we are running from console
SomeMain.main(new String[] {"some", "console", "arguments"})
もちろん、これを外部ライブラリとして単純に使用し、SomeMain.main() を呼び出さずに必要なコードにアクセスするのが最善のシナリオです。ベスト プラクティスを順守し、カプセル化されたモジュール オブジェクトを適切に作成することで、他のアプリケーションで使用する際の移植性と使いやすさが大幅に向上します。
JVM を離れてシステム コマンドに移行すると、プラットフォーム固有のコマンドを自分で処理する必要があります。JVM は抽象化のための優れた方法を提供します。
Java 固有のバイナリを実行する場合は、Java の ant ライブラリを確認してください。プラットフォームに依存するコマンドを実行する Java から Ant スクリプトを実行できます。