Выбор основного класса в работающей банке во время выполнения - PullRequest
29 голосов
/ 07 января 2010

У меня есть два основных класса в приложении. Когда я упаковываю его в работающий флягу (используя функцию экспорта Eclipse), я должен выбрать основной класс по умолчанию.

Есть ли способ получить доступ к основному классу не по умолчанию из jar во время выполнения?

Ответы [ 2 ]

44 голосов
/ 07 января 2010

Вы можете получить доступ как через java -cp myapp.jar com.example.Main1, так и java -cp myapp.jar com.example.Main2. Основной класс по умолчанию в jar предназначен для того, когда вы вызываете ваше приложение через java -jar myapp.jar.

Подробнее см. JAR_ (file_format) . Когда вы выбираете основной класс в Eclipse, он устанавливается следующим образом: Main-Class: myPrograms.MyClass внутри манифеста jar META-INF/MANIFEST.MF в стороне от файла jar.

8 голосов
/ 07 января 2010

Да, это возможно. Под каждым из них можно добавить другой класс с основным методом для того, который выполняет требуемый класс / метод на основе аргумента.

* 1003 Е.Г. *

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();
}
...