#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 и должны правильно завершить процесс, иначе ваш компьютер может достичь предела для файловых дескрипторов.