«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-plugin. Чтобы быть более конкретным, цель 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 для передачи полное имя класса.

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

Мы можем добиться того же самого с помощью простых java и javac. Однако это может быть громоздко, когда мы работаем с довольно большим путем к классам. Напротив, при использовании этого плагина Maven автоматически позаботится о заполнении пути к классам.

3. Передача аргументов

Также можно передавать аргументы из командной строки в основной метод. Для этого мы можем использовать системное свойство exec.args:

$ 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. Таким образом, мы можем использовать пользовательские конфигурации и конфигурации по умолчанию.

Например, мы можем указать основной класс по умолчанию в конфигурации плагина:

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>3.0.0</version>
            <configuration>
                <mainClass>com.baeldung.main.Exec</mainClass>
            </configuration>
        </plugin>
    </plugins>
</build>

Теперь, если мы не укажем полное имя нужного класса, будет использоваться com.baeldung.main.Exec :

$ mvn compile exec:java
02:33:14.197 INFO com.baeldung.main.Exec - Running the main method

Однако эту конфигурацию по умолчанию можно переопределить с помощью явного системного свойства exec.mainClass.

Кроме того, мы также можем указать аргументы программы по умолчанию в нашей конфигурации:

<configuration>
    <mainClass>com.baeldung.main.Exec</mainClass>
    <arguments>
        <argument>First</argument>
        <argument>Second</argument>
    </arguments>
</configuration>

Таким образом, нам не нужно будет передавать эти аргументы в командной строке:

$ 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.