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

#java #main #launch

#java #program-entry-point #запустить

Вопрос:

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

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

Ответ №1:

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

 java -jar myapp.jar
  

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

 java -classpath myapp.jar com.mypackage.app.Main01 amp;amp; 
  java -classpath myapp.jar com.mypackage.app.Main02 amp;amp; 
  java -classpath myapp.jar com.mypackage.app.Main03
  

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

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

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

Ответ №2:

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

Комментарии:

1. Ну, в первую очередь, я хочу, чтобы эти пакеты действовали почти независимо, поэтому я не хочу, чтобы основная программа выполняла другие основные программы.

2. ну, они все равно будут независимыми, это будет запуск только тех программ, которые у вас есть. Если вы можете предоставить больше информации о том, что вы пытаетесь сделать, я или другие, вероятно, сможем предложить более подходящие решения для вашего случая

3. Нет, программа запуска Java всегда запускается в одном потоке с помощью метода main одного класса. Если вам нужно больше, вы должны сделать это самостоятельно.

Ответ №3:

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

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

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