Предаване на аргументи от командния ред в Gradle

1. Общ преглед

Понякога искаме да изпълним различни програми от Gradle, които изискват входни параметри.

В този бърз урок ще видим как да предаваме аргументи от командния ред от Gradle.

2. Видове входни аргументи

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

  • задаване на системни свойства с флага -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.javaMain 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.javaMain 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.