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 .