Выбор основного класса в исполняемой банке во время выполнения
У меня есть два основных класса в приложении. Когда я упаковываю его в runnable jar (используя функцию экспорта Eclipse), я должен выбрать основной класс по умолчанию.
Есть ли способ получить доступ к основному классу, отличному от стандартного, из флага во время выполнения?
Ответы
Ответ 1
Вы можете получить доступ как через java -cp myapp.jar com.example.Main1
, так и java -cp myapp.jar com.example.Main2
. Основной класс по умолчанию в банке - это когда вы вызываете свое приложение через java -jar myapp.jar
.
Подробнее см. JAR_(file_format). Когда вы выбираете основной класс в Eclipse, это то, что устанавливается в: Main-Class: myPrograms.MyClass
внутри манифеста jar META-INF/MANIFEST.MF
в стороне файла jar.
Ответ 2
Да, это возможно. Вы можете под каждым добавить другой класс с основным методом для того, который выполняет требуемый класс/метод на основе аргумента.
например.
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();
}