Как запустить несколько основных программ в исполняемом файле Java .jar?

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

Если лучший способ запустить это через ant. Какой муравьиный скрипт написать, если я хочу запускать... скажем, основные программы в пакетах com.myapp.package1.main, com.myapp.package2.main и com.myapp.package3.main. Заранее спасибо!


person Brian    schedule 11.05.2011    source источник


Ответы (3)


Манифест jar позволяет указать не более одного основного класса. Это вызывается, когда вы выполняете java с флагом -jar.

java -jar myapp.jar

Вы можете включить несколько основных классов в один jar, но каждый (кроме необязательного 1 выше) должен вызываться с использованием флага -classpath и с указанием полного имени основного класса.

java -classpath myapp.jar com.mypackage.app.Main01 && \
  java -classpath myapp.jar com.mypackage.app.Main02 && \
  java -classpath myapp.jar com.mypackage.app.Main03

В приведенном выше примере будут созданы три отдельные виртуальные машины Java, каждая в своем собственном процессе. Очевидно, это не соответствует вашему требованию к «исполняемому банку».

В качестве альтернативы вы можете захотеть иметь один основной метод, который запускает отдельные потоки, чтобы был только один процесс, но с параллельным выполнением.

Ant не подходит для решения этой проблемы. Я подозреваю, что вам, вероятно, нужен один основной метод, который порождает несколько потоков. Не стесняйтесь предоставлять дополнительную информацию о ваших требованиях.

person Synesso    schedule 11.05.2011

Вы можете создать один основной «основной» класс, который выполняет остальные.

person fmucar    schedule 11.05.2011
comment
Ну, прежде всего, я хочу, чтобы эти пакеты действовали почти независимо, поэтому я не хочу, чтобы основная программа выполняла другие основные программы. - person Brian; 11.05.2011
comment
ну они все равно будут независимыми, это будет только запуск программ которые у вас есть. Если вы можете предоставить больше информации о том, что вы пытаетесь сделать, я или другие, возможно, смогут предложить более подходящие решения для вашего случая. - person fmucar; 11.05.2011
comment
Нет, программа запуска Java всегда запускается в одном потоке с основным методом одного класса. Если вам нужно больше, вы должны сделать это самостоятельно. - person Paŭlo Ebermann; 11.05.2011

Вероятно, я бы придерживался решения MANIFEST, но есть и другая возможность сделать это:

Process p = Runtime.getRuntime().exec("java -jar another.jar");

Но здесь вы должны быть осторожны с путем и правильно завершать процесс, иначе ваша машина может достичь предела файловых дескрипторов.

person Serhiy    schedule 11.05.2011