«1. Введение

В этом руководстве мы рассмотрим различные методы выполнения основного метода Java с помощью Gradle.

2. Основной метод Java

Есть несколько способов запуска основного метода Java с помощью Gradle. Давайте рассмотрим их внимательно, используя простую программу, которая выводит сообщение на стандартный вывод: задачи, которые помогают нам упаковывать и распространять наше приложение.

public class MainClass {
    public static void main(String[] args) {
        System.out.println("Goodbye cruel world ...");
    }
}

Давайте начнем с того, что вставим следующее в наш файл build.gradle:

Плагин автоматически создает задачу с именем run, которая требует от нас только указания на основной класс. Замыкание в строке 9 делает именно то, что позволяет нам запускать задачу:

4. Запуск с помощью задачи JavaExec

plugins {
    id "application"
}
apply plugin : "java" 
ext {
   javaMainClass = "com.baeldung.gradle.exec.MainClass"
}

application {
    mainClassName = javaMainClass
}

Далее давайте реализуем пользовательскую задачу для запуска основного метода с помощью Тип задачи JavaExec:

~/work/baeldung/tutorials/gradle-java-exec> ./gradlew run

> Task :run
Goodbye cruel world ...

BUILD SUCCESSFUL in 531ms
2 actionable tasks: 1 executed, 1 up-to-date

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

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

task runWithJavaExec(type: JavaExec) {
    group = "Execution"
    description = "Run the main class with JavaExecTask"
    classpath = sourceSets.main.runtimeClasspath
    main = javaMainClass
}

Давайте запустим наш пример, используя JavaExec:

5. Запуск с задачей Exec

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

~/work/baeldung/tutorials/gradle-java-exec> ./gradlew runWithJavaExec

> Task :runWithJavaExec
Goodbye cruel world ...

BUILD SUCCESSFUL in 526ms
2 actionable tasks: 1 executed, 1 up-to-date

5.1. Запуск из скомпилированного вывода сборки

Сначала мы создаем пользовательскую задачу Exec, которая ведет себя аналогично JavaExec:

Мы можем запустить любой исполняемый файл (в данном случае java) и передать необходимые аргументы для его запуска.

Мы настраиваем путь к классам и указываем на наш основной класс в строке 5, а также добавляем зависимость к задаче сборки в строке 2. Это необходимо, так как мы можем запустить наш основной класс только после его компиляции: ~~ ~

task runWithExec(type: Exec) {
    dependsOn build
    group = "Execution"
    description = "Run the main class with ExecTask"
    commandLine "java", "-classpath", sourceSets.main.runtimeClasspath.getAsPath(), javaMainClass
}

5.2. Запуск из выходного файла Jar

Второй подход основан на упаковке jar нашего небольшого приложения:

~/work/baeldung/tutorials/gradle-java-exec> ./gradlew runWithExec

> Task :runWithExec
Goodbye cruel world ...

BUILD SUCCESSFUL in 666ms
6 actionable tasks: 6 executed

Обратите внимание на зависимость от задачи jar в строке 2 и второго аргумента исполняемого файла java в строке 5. Мы использовать обычный jar, поэтому нам нужно указать точку входа с четвертым параметром:

5.3. Запуск из исполняемого выходного файла Jar

task runWithExecJarOnClassPath(type: Exec) {
    dependsOn jar
    group = "Execution"
    description = "Run the mainClass from the output jar in classpath with ExecTask"
    commandLine "java", "-classpath", jar.archiveFile.get(), javaMainClass
}

Третий способ также зависит от упаковки jar, но мы определяем точку входа с помощью свойства манифеста:

~/work/baeldung/tutorials/gradle-java-exec> ./gradlew runWithExecJarOnClassPath

> Task :runWithExecJarOnClassPath
Goodbye cruel world ...

BUILD SUCCESSFUL in 555ms
3 actionable tasks: 3 executed

Здесь нам больше не нужно указывать путь к классам, и мы можем просто запустить банку:

6. Заключение

jar {
    manifest {
        attributes(
            "Main-Class": javaMainClass
        )
    }
}

task runWithExecJarExecutable(type: Exec) {
    dependsOn jar
    group = "Execution"
    description = "Run the output executable jar with ExecTask"
    commandLine "java", "-jar", jar.archiveFile.get()
}

В этой статье мы рассмотрели различные способы запуска основного метода Java с помощью Gradle.

~/work/baeldung/tutorials/gradle-java-exec> ./gradlew runWithExecJarExecutable

> Task :runWithExecJarExecutable
Goodbye cruel world ...

BUILD SUCCESSFUL in 572ms
3 actionable tasks: 3 executed

По умолчанию плагин Application предоставляет минимально настраиваемую задачу для запуска нашего метода. Тип задачи JavaExec позволяет нам запускать основной метод без указания каких-либо плагинов.

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

Как обычно, исходный код этого руководства доступен на GitHub.

«

As usual, the source code for this tutorial is available over on GitHub.