Перейти к основному содержимому

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

· 4 мин. чтения

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")+"]"
}
}

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

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

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

Далее запустим задачу и посмотрим ее вывод:

$ ./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. Передача аргументов командной строки

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

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

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

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

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

// previous declarations

ext.javaMainClass = "com.foreach.cmd.MainClass"

application {
mainClassName = javaMainClass
}

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

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 + "]");
}
}
}

Далее запустим его с некоторыми аргументами:

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

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

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

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

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

ext.javaMainClass = "com.foreach.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 :

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

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

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

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

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()
}

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

Давайте посмотрим, как запустить это для команды 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 .