web-dev-qa-db-ja.com

実行時に実行可能なjarのメインクラスを選択する

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

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

29
Tomasz

_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.MyClass_ jarファイル内の_META-INF/MANIFEST.MF_。

44
Jeremy Raymond

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

例えば。

_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ブロックを取り除くために)、Actionインターフェースをvoid execute()で実装し、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();
}
_
8
BalusC