«1. Обзор

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

В этом кратком руководстве мы увидим, как передавать аргументы командной строки из Gradle.

2. Типы входных аргументов

Когда мы хотим передать входные аргументы из CLI Gradle, у нас есть два варианта:

    установка системных свойств с флагом -D установка свойств проекта с флагом -P ~~ ~ В общем, мы должны использовать свойства проекта, если только мы не хотим настраивать параметры в JVM.

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

Давайте посмотрим на эти свойства в действии. Во-первых, мы настраиваем наш build.gradle:

Обратите внимание, что мы читаем их по-разному в нашей задаче.

apply plugin: "java"
description = "Gradle Command Line Arguments examples"

task propertyTypes(){
    doLast{
        if (project.hasProperty("args")) {
            println "Our input argument with project property ["+project.getProperty("args")+"]"
        }
        println "Our input argument with system property ["+System.getProperty("args")+"]"
    }
}

Мы делаем это, потому что project.getProperty() генерирует исключение MissingPropertyException, если наше свойство не определено.

В отличие от свойств проекта, System.getProperty() возвращает нулевое значение, если свойство не определено.

Теперь давайте запустим задачу и посмотрим на ее результат:

3. Передача аргументов командной строки

$ ./gradlew propertyTypes -Dargs=lorem -Pargs=ipsum

> Task :cmd-line-args:propertyTypes
Our input argument with project property [ipsum]
Our input argument with system property [lorem]

До сих пор мы только видели, как читать свойства. На практике нам нужно отправить эти свойства в качестве аргументов в выбранную нами программу.

3.1. Передача аргументов в приложения Java

В предыдущем уроке мы объяснили, как запускать основные классы Java из Gradle. Давайте опираться на это и посмотрим, как мы можем также передавать аргументы.

Во-первых, давайте воспользуемся подключаемым модулем приложения в нашем build.gradle:

Теперь давайте посмотрим на наш основной класс:

apply plugin: "java"
apply plugin: "application"
description = "Gradle Command Line Arguments examples"
 
// previous declarations
 
ext.javaMainClass = "com.baeldung.cmd.MainClass"
 
application {
    mainClassName = javaMainClass
}

Далее, давайте s запустить его с некоторыми аргументами:

public class MainClass {
    public static void main(String[] args) {
        System.out.println("Gradle command line arguments example");
        for (String arg : args) {
            System.out.println("Got argument [" + arg + "]");
        }
    }
}

Здесь мы не используем свойства для передачи аргументов. Вместо этого мы передаем туда флаг —args и соответствующие входные данные.

$ ./gradlew :cmd-line-args:run --args="lorem ipsum dolor"

> Task :cmd-line-args:run
Gradle command line arguments example
Got argument [lorem]
Got argument [ipsum]
Got argument [dolor]

Это хорошая оболочка, предоставляемая подключаемым модулем приложения. Однако это доступно только начиная с Gradle 4.9.

Давайте посмотрим, как это будет выглядеть при использовании задачи JavaExec.

Во-первых, нам нужно определить его в нашем build.gradle:

Давайте подробнее рассмотрим, что мы сделали. Сначала мы читаем аргументы из свойства проекта.

ext.javaMainClass = "com.baeldung.cmd.MainClass"
if (project.hasProperty("args")) {
    ext.cmdargs = project.getProperty("args")
} else { 
    ext.cmdargs = ""
}
task cmdLineJavaExec(type: JavaExec) {
    group = "Execution"
    description = "Run the main class with JavaExecTask"
    classpath = sourceSets.main.runtimeClasspath
    main = javaMainClass
    args cmdargs.split()
}

Так как он содержит все аргументы в виде одной строки, мы используем метод split для получения массива аргументов.

Далее мы передаем этот массив в свойство args нашей задачи JavaExec.

Давайте посмотрим, что произойдет, когда мы запустим эту задачу, передав свойства проекта с опцией -P:

3.2. Передача аргументов другим приложениям

$ ./gradlew cmdLineJavaExec -Pargs="lorem ipsum dolor"

> Task :cmd-line-args:cmdLineJavaExec
Gradle command line arguments example
Got argument [lorem]
Got argument [ipsum]
Got argument [dolor]

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

К счастью, для этого мы можем использовать более общую задачу Exec:

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

if (project.hasProperty("args")) {
    ext.cmdargs = project.getProperty("args")
} else { 
    ext.cmdargs = "ls"
}
 
task cmdLineExec(type: Exec) {
    group = "Execution"
    description = "Run an external program with ExecTask"
    commandLine cmdargs.split()
}

Давайте посмотрим, как запустить это для команды ls:

Это может быть очень полезно, если мы не хотим жестко кодировать исполняемый файл в задаче.

$ ./gradlew cmdLineExec -Pargs="ls -ll"

> Task :cmd-line-args:cmdLineExec
total 4
drwxr-xr-x 1 user 1049089    0 Sep  1 17:59 bin
drwxr-xr-x 1 user 1049089    0 Sep  1 18:30 build
-rw-r--r-- 1 user 1049089 1016 Sep  3 15:32 build.gradle
drwxr-xr-x 1 user 1049089    0 Sep  1 17:52 src

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

В этом кратком руководстве мы увидели, как передавать входные аргументы из Gradle.

Сначала мы объяснили типы свойств, которые мы можем использовать. Хотя мы можем использовать системные свойства для передачи входных аргументов, вместо этого мы должны предпочесть свойства проекта.

Затем мы рассмотрели различные подходы к передаче аргументов командной строки в Java или внешние приложения.

Как обычно, полный код можно найти на GitHub.

«