1. Введение
В этом руководстве мы рассмотрим различные методы выполнения основного
метода Java `` с помощью Gradle.
2. Основной
метод Java
Есть несколько способов запуска основного
метода Java с помощью Gradle. Давайте посмотрим на них внимательно, используя простую программу, которая выводит сообщение на стандартный вывод:
public class MainClass {
public static void main(String[] args) {
System.out.println("Goodbye cruel world ...");
}
}
3. Запуск с подключаемым модулем приложения
Плагин приложения — это основной плагин Gradle, который определяет набор готовых к использованию задач, которые помогают нам упаковывать и распространять наше приложение.
Начнем с того, что вставим в наш файл build.gradle следующее
:
plugins {
id "application"
}
apply plugin : "java"
ext {
javaMainClass = "com.foreach.gradle.exec.MainClass"
}
application {
mainClassName = javaMainClass
}
Плагин автоматически генерирует задачу под названием run
, которая требует от нас только указания на основной
класс. Замыкание в строке 9 делает именно это, что позволяет нам запустить задачу:
~/work/foreach/tutorials/gradle-java-exec> ./gradlew run
> Task :run
Goodbye cruel world ...
BUILD SUCCESSFUL in 531ms
2 actionable tasks: 1 executed, 1 up-to-date
4. Запуск с помощью задачи JavaExec
Далее реализуем пользовательскую задачу для запуска основного
метода с помощью типа задачи JavaExec
:
task runWithJavaExec(type: JavaExec) {
group = "Execution"
description = "Run the main class with JavaExecTask"
classpath = sourceSets.main.runtimeClasspath
main = javaMainClass
}
Нам нужно определить основной
класс в строке 5 и дополнительно указать путь к классам. Путь к классам вычисляется из свойств по умолчанию выходных данных сборки и содержит правильный путь, где фактически размещается скомпилированный класс.
Обратите внимание, что в каждом сценарии мы используем полное имя, включая package, основного
класса .
Давайте запустим наш пример, используя JavaExec
:
~/work/foreach/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. Запуск с Exec
Task
Наконец, мы можем выполнить наш основной
класс, используя базовый тип задачи Exec .
Поскольку этот вариант дает нам возможность настроить выполнение несколькими способами, давайте реализуем три настраиваемые задачи и обсудим их по отдельности.
5.1. Запуск из скомпилированного вывода сборки
Во-первых, мы создаем пользовательскую задачу Exec
, которая ведет себя аналогично JavaExec
:
task runWithExec(type: Exec) {
dependsOn build
group = "Execution"
description = "Run the main class with ExecTask"
commandLine "java", "-classpath", sourceSets.main.runtimeClasspath.getAsPath(), javaMainClass
}
Мы можем запустить любой исполняемый файл (в данном случае java) и передать необходимые аргументы для его запуска.
Мы настраиваем путь к классам и указываем на наш основной
класс в строке 5, а также добавляем зависимость к задаче сборки
в строке 2. Это необходимо, так как мы можем запустить наш основной
класс только после его компиляции:
~/work/foreach/tutorials/gradle-java-exec> ./gradlew runWithExec
> Task :runWithExec
Goodbye cruel world ...
BUILD SUCCESSFUL in 666ms
6 actionable tasks: 6 executed
5.2. Запуск из выходного JAR
Второй подход основан на упаковке 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 в строке 2 и второго аргумента исполняемого файла java в строке 5. Мы используем обычный jar, поэтому нам нужно указать точку входа с четвертым параметром:
~/work/foreach/tutorials/gradle-java-exec> ./gradlew runWithExecJarOnClassPath
> Task :runWithExecJarOnClassPath
Goodbye cruel world ...
BUILD SUCCESSFUL in 555ms
3 actionable tasks: 3 executed
5.3. Запуск из исполняемого выходного файла JAR
Третий способ также опирается на упаковку jar, но мы определяем точку входа с помощью свойства манифеста :
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()
}
Здесь нам больше не нужно указывать путь к классам , и мы можем просто запустить банку:
~/work/foreach/tutorials/gradle-java-exec> ./gradlew runWithExecJarExecutable
> Task :runWithExecJarExecutable
Goodbye cruel world ...
BUILD SUCCESSFUL in 572ms
3 actionable tasks: 3 executed
6. Заключение
В этой статье мы рассмотрели различные способы запуска основного
метода Java с помощью Gradle.
По умолчанию плагин Application предоставляет минимально настраиваемую задачу для запуска нашего метода. Тип задачи JavaExec
позволяет нам запускать основной
метод без указания каких-либо плагинов.
Наконец, общий тип задачи Exec
может использоваться в различных комбинациях с исполняемым файлом java для достижения тех же результатов, но требует зависимости от других задач.
Как обычно, исходный код этого руководства доступен на GitHub .