- Запуск программ Java в сборке Maven
- 1: Настройка плагина в pom.xml
- 2: Запуск сборки maven с целью exec:java
- Запустите основной метод Java в Maven
- 2. Плагин exec-maven
- 3. Передача аргументов
- 4. Пользовательская конфигурация
- 5. Вывод
- Запустите метод Java Main в Maven
- 1. Обзор
- 2. Плагин exec-maven
- 3. Передача Аргументов
- 4. Пользовательская конфигурация
- 5. Заключение
- Maven exec java main
- Usage
- Exec goal
- Command line
- POM Configuration
- Java goal
- Differences compared to plain command line
- Command line
- POM Configuration
Запуск программ Java в сборке Maven
Плагин exec в Maven позволяет выполнять системные и Java-программы из командной строки maven.
У данного плагина есть две цели:
- exec:exec — выполняет любую программу в отдельном процессе.
- exec:java — может запускать программы Java на той же виртуальной машине.
В этом руководстве мы узнаем, как использовать цель exec:java для запуска программы Java в сборке maven.
1: Настройка плагина в pom.xml
Если вы хотите использовать какой-либо плагин maven, вам нужно настроить его в разделе сборки pom.xml. Просто добавьте приведенную ниже конфигурацию плагина в файл проекта pom.xml.
plugin> groupId>org.codehaus.mojogroupId> artifactId>exec-maven-pluginartifactId> version>1.6.0version> configuration> mainClass>com.journaldev.maven.utils.BuildInfomainClass> configuration> plugin>
Наиболее важным моментом, на который следует обратить внимание, является элемент mainClass внутри configuration . Здесь мы указываем класс Java, который будет выполняться целью exec:java.
Вот содержимое класса Java. Это простой класс, в котором мы выводим сведения о версии Java и текущее время.
package com.journaldev.maven.utils; import java.time.LocalDateTime; public class BuildInfo public static void main(String[] args) String javaVersion = Runtime.version().toString(); String time = LocalDateTime.now().toString(); System.out.println("********\nBuild Time: " + time + "\nJava Version: " + javaVersion + "\n********"); > >
2: Запуск сборки maven с целью exec:java
Если мы запустим сборку maven с целью exec:java, мы получим следующий результат:
$ mvn exec:java [INFO] Scanning for projects... [INFO] [INFO] --------------- com.journaldev.maven:maven-example-jar >--------------- [INFO] Building maven-example-jar 0.0.1-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- exec-maven-plugin:1.6.0:java (default-cli) @ maven-example-jar --- ******** Build Time: 2020-01-10T12:44:17.718061 Java Version: 13.0.1+9 ******** [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 0.591 s [INFO] Finished at: 2020-01-10T12:44:17+05:30 [INFO] ------------------------------------------------------------------------ $
Запустите основной метод Java в Maven
В этом кратком руководстве мы увидим, как запускать произвольные основные методы из любого класса Java с помощью Maven.
2. Плагин exec-maven
Предположим, у нас есть следующий класс:
public class Exec private static final Logger LOGGER = LoggerFactory.getLogger(Exec.class); public static void main(String[] args) LOGGER.info("Running the main method"); if (args.length > 0) LOGGER.info("List of arguments: <>", Arrays.toString(args)); > > >
И мы хотим выполнить его основной метод из командной строки через Maven.
Для этого мы можем использовать exec-maven-plugin . Чтобы быть более конкретным, цель exec:java из этого плагина выполняет предоставленный класс Java с зависимостями прилагаемого проекта в качестве пути к классам.
Чтобы выполнить основной метод класса Exec , мы должны передать плагину полное имя класса:
$ mvn compile exec:java -Dexec.mainClass="com.foreach.main.Exec" 02:26:45.112 INFO com.foreach.main.Exec - Running the main method
Как показано выше, мы используем системное свойство exec.mainClass для передачи полного имени класса.
Кроме того, мы должны убедиться, что путь к классам готов, прежде чем запускать основной метод. Вот почему мы компилируем исходный код перед выполнением основного метода.
Мы можем добиться того же самого с помощью простых java и javac. Однако это может быть громоздко, когда мы работаем с довольно большим путем к классам. Напротив, « при использовании этого плагина Maven автоматически позаботится о заполнении пути к классам.
3. Передача аргументов
Также можно передавать аргументы из командной строки в основной метод. Для этого мы можем использовать системное свойство exec.args :
$ mvn compile exec:java -Dexec.mainClass="com.foreach.main.Exec" \ -Dexec.args="First Second" 02:31:08.235 INFO com.foreach.main.Exec - Running the main method 02:31:08.236 INFO com.foreach.main.Exec - List of arguments: [First, Second]
Как показано выше, мы передаем список аргументов, разделенных пробелами. Более того, мы можем использовать список аргументов через запятую через системное свойство exec.arguments :
$ mvn compile exec:java -Dexec.mainClass="com.foreach.main.Exec" \ -Dexec.arguments="Hello World,Bye" 02:32:25.616 INFO com.foreach.main.Exec - Running the main method 02:32:25.618 INFO com.foreach.main.Exec - List of arguments: [Hello World, Bye]
Эти две опции могут быть полезны, когда мы хотим использовать разделитель (пробел или запятую) в самом аргументе.
4. Пользовательская конфигурация
Мы также можем явно объявить зависимость плагина в нашем pom.xml . Таким образом, мы можем использовать пользовательские конфигурации и конфигурации по умолчанию.
Например, мы можем указать основной класс по умолчанию в конфигурации плагина:
build> plugins> plugin> groupId>org.codehaus.mojogroupId> artifactId>exec-maven-pluginartifactId> version>3.0.0version> configuration> mainClass>com.foreach.main.ExecmainClass> configuration> plugin> plugins> build>
Теперь, если мы не укажем полное имя нужного класса, будет использоваться com.foreach.main.Exec :
$ mvn compile exec:java 02:33:14.197 INFO com.foreach.main.Exec - Running the main method
Однако по-прежнему возможно переопределить эту конфигурацию по умолчанию с помощью явного exec . Системное свойство mainClass .
Кроме того, мы также можем указать аргументы программы по умолчанию в нашей конфигурации:
configuration> mainClass>com.foreach.main.ExecmainClass> arguments> argument>Firstargument> argument>Secondargument> arguments> configuration>
Таким образом, нам не нужно будет передавать эти аргументы в командной строке:
$ mvn clean compile exec:java 02:34:24.448 INFO com.foreach.main.Exec - Running the main method 02:34:24.450 INFO com.foreach.main.Exec - List of arguments: [First, Second]
В дополнение к этим конфигурациям доступно множество других, которые описаны в официальной документации .
5. Вывод
В этой короткой статье мы увидели, как запускать основные методы из командной строки через exec-maven-plugin .
Как обычно, все примеры доступны на GitHub .
Запустите метод Java Main в Maven
Узнайте, как запустить основной метод Java с помощью Maven.
1. Обзор
В этом коротком уроке мы увидим, как запускать произвольные основные методы из любого класса Java с помощью Maven.
2. Плагин exec-maven
Предположим, у нас есть следующий класс:
public class Exec < private static final Logger LOGGER = LoggerFactory.getLogger(Exec.class); public static void main(String[] args) < LOGGER.info("Running the main method"); if (args.length >0) < LOGGER.info("List of arguments: <>", Arrays.toString(args)); > > >
И мы хотим выполнить его основной метод из командной строки через Maven.
Для этого мы можем использовать exec-maven-плагин . Если быть более конкретным, то exec:java цель из этого плагина выполняется поставляемый класс Java с зависимостями заключающего проекта в качестве пути к классу.
Чтобы выполнить основной метод класса Exec , мы должны передать полное имя класса плагину:
$ mvn compile exec:java -Dexec.mainClass="com.baeldung.main.Exec" 02:26:45.112 INFO com.baeldung.main.Exec - Running the main method
Как показано выше, мы используем свойство exec.MainClass system для передачи полного имени класса.
Кроме того, мы должны убедиться, что путь к классу готов, прежде чем запускать основной метод. Вот почему мы компилируем исходный код перед выполнением основного метода.
Мы можем добиться того же с помощью простых java и javac. Однако это может быть громоздко, когда мы работаем с довольно большим классом. Напротив, при использовании этого плагина Maven автоматически позаботится о заполнении пути к классу.
3. Передача Аргументов
Также можно передавать аргументы из командной строки в основной метод. Для этого мы можем использовать свойство exec.args system:
$ mvn compile exec:java -Dexec.mainClass="com.baeldung.main.Exec" \ -Dexec.args="First Second" 02:31:08.235 INFO com.baeldung.main.Exec - Running the main method 02:31:08.236 INFO com.baeldung.main.Exec - List of arguments: [First, Second]
Как показано выше, мы передаем список аргументов, разделенных пробелами. Кроме того, мы можем использовать разделенный запятыми список аргументов с помощью системного свойства exec.arguments :
$ mvn compile exec:java -Dexec.mainClass="com.baeldung.main.Exec" \ -Dexec.arguments="Hello World,Bye" 02:32:25.616 INFO com.baeldung.main.Exec - Running the main method 02:32:25.618 INFO com.baeldung.main.Exec - List of arguments: [Hello World, Bye]
Эти два параметра могут быть полезны, когда мы хотим использовать разделитель (пробел или запятую) в самом аргументе.
4. Пользовательская конфигурация
Мы также можем явно объявить зависимость плагина в вашем pom.xml . Таким образом, мы можем использовать пользовательские конфигурации и конфигурации по умолчанию.
Например, мы можем указать основной класс по умолчанию в конфигурации плагина:
org.codehaus.mojo exec-maven-plugin 3.0.0 com.baeldung.main.Exec
Теперь, если мы не указываем полное имя нужного класса, com.baeldung.main.Exec будет использоваться:
$ mvn compile exec:java 02:33:14.197 INFO com.baeldung.main.Exec - Running the main method
Однако по-прежнему можно переопределить эту конфигурацию по умолчанию с помощью явного exec . MainClass системное свойство.
Кроме того, мы также можем указать аргументы программы по умолчанию в нашей конфигурации:
com.baeldung.main.Exec First Second
Таким образом, нам не нужно будет передавать эти аргументы в командной строке:
$ mvn clean compile exec:java 02:34:24.448 INFO com.baeldung.main.Exec - Running the main method 02:34:24.450 INFO com.baeldung.main.Exec - List of arguments: [First, Second]
В дополнение к этим конфигурациям есть еще много доступных, которые описаны в официальной документации .
5. Заключение
В этой короткой статье мы рассмотрели, как запустить основные методы из командной строки через exec-maven-plugin .
Как обычно, все примеры доступны на GitHub .
Maven exec java main
- MojoHaus /
- Exec Maven Plugin /
- Usage
- | Last Published: 2022-07-19
- | Version: 3.1.0
- Maven
Usage
Exec goal
You can formally specify all the relevant execution information in the plugin configuration. Depending on your use case, you can also specify some or all information using system properties.
Command line
Using system properties you would just execute it like in the following example.
mvn exec:exec -Dexec.executable="maven" [-Dexec.workingdir="/tmp"] -Dexec.args="-X myproject:dist"
POM Configuration
Add a configuration similar to the following to your POM:
. . org.codehaus.mojo exec-maven-plugin 3.1.0 . exec maven /tmp -X myproject:dist .en_US
Java goal
This goal helps you run a Java program within the same VM as Maven.
Differences compared to plain command line
The goal goes to great length to try to mimic the way the VM works, but there are some subtle differences. Today all differences come from the way the goal deals with thread management.
command line | Java Mojo |
The VM exits as soon as the only remaining threads are daemon threads | By default daemon threads are joined and interrupted once all known non daemon threads have quit. The join timeout is customisable The user might wish to further cleanup by stopping the unresponsive threads. The user can disable the full extra thread management (interrupt/join/[stop]) |
Read the documentation for the java goal for more information on how to configure this behavior.
If you find out that these differences are unacceptable for your case, you may need to use the exec goal to wrap your Java executable.
Command line
If you want to execute Java programs in the same VM, you can either use the command line version
mvn exec:java -Dexec.mainClass="com.example.Main" [-Dexec.args="argument1"] .
POM Configuration
or you can configure the plugin in your POM:
. . org.codehaus.mojo exec-maven-plugin 3.1.0 . java com.example.Main argument1 .. myproperty myvalue
Note: The java goal doesn’t spawn a new process. Any VM specific option that you want to pass to the executed class must be passed to the Maven VM using the MAVEN_OPTS environment variable. E.g.
Otherwise consider using the exec goal.