1

スタンドアロンの Java プログラムから Java コマンドを呼び出す方法を教えてください。

Runtime.getRuntime().exec("cmd c/ javac <>.java"); を理解しています。動作します。ただし、これはプラットフォーム固有です。

j2sdk1.4 で動作させることができる他の A​​PI はありますか?

4

4 に答える 4

3

すべてを同じ 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%
于 2009-05-12T07:15:19.587 に答える
2

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() を呼び出さずに必要なコードにアクセスするのが最善のシナリオです。ベスト プラクティスを順守し、カプセル化されたモジュール オブジェクトを適切に作成することで、他のアプリケーションで使用する際の移植性と使いやすさが大幅に向上します。

于 2009-05-12T08:25:43.560 に答える
0

JVM を離れてシステム コマンドに移行すると、プラットフォーム固有のコマンドを自分で処理する必要があります。JVM は抽象化のための優れた方法を提供します。

Java 固有のバイナリを実行する場合は、Java の ant ライブラリを確認してください。プラットフォームに依存するコマンドを実行する Java から Ant スクリプトを実行できます。

于 2009-05-12T06:34:07.470 に答える