29

アプリには 2 つの主要なクラスがあります。(Eclipse エクスポート機能を使用して) 実行可能な jar にパッケージ化するとき、デフォルトのメイン クラスを選択する必要があります。

実行時にjarからデフォルト以外のメインクラスにアクセスする方法はありますか?

4

2 に答える 2

44

java -cp myapp.jar com.example.Main1との両方からアクセスできますjava -cp myapp.jar com.example.Main2。jar のデフォルトのメイン クラスは、 を介してアプリを呼び出すときのものですjava -jar myapp.jar

詳細については、 JAR_(file_format)を参照してください。Eclipse でメイン クラスを選択すると、jar ファイルの横にあるMain-Class: myPrograms.MyClassjar マニフェスト内に設定されます。META-INF/MANIFEST.MF

于 2010-01-07T20:49:44.090 に答える
8

はい、可能です。それぞれの下に、引数に基づいて目的のクラス/メソッドを実行するメイン メソッドを持つ別のクラスを追加できます。

例えば

public static void main(String... args) {
    if ("foo".equals(args[0])) {
        Foo.main(args);
    } else if ("bar".equals(args[0])) {
        Bar.main(args);
    }
 }

(などの明らかなチェックを自分で追加することを忘れないでくださいargs.length

次のように使用できます。

java -jar YourJar.jar foo

ただし、適切に設計されていればmain()、他のクラスのメソッドを不要にすることができます。例えば

public static void main(String... args) {
    if ("foo".equals(args[0])) {
        new Foo().execute();
    } else if ("bar".equals(args[0])) {
        new Bar().execute();
    }
 }

これをさらに抽象化するには (if/else ブロックを取り除くため)、 a を使用していくつかのActionインターフェイスを実装void execute()し、 a でそれらを保持できるようにすることを検討できMapます。

private static Map<String, Action> actions = new HashMap<String, Action>();
static {
    actions.put("foo", new Foo());
    actions.put("bar", new Bar());
}

public static void main(String... args) {
    actions.get(args[0]).execute();
}
于 2010-01-07T20:51:00.233 に答える