Videregivelse af kommandolinjeargumenter i Gradle

1. Oversigt

Nogle gange ønsker vi at udføre forskellige programmer fra Gradle, der kræver inputparametre.

I denne hurtige vejledning skal vi se, hvordan vi sender kommandolinjeargumenter fra Gradle.

2. Typer af inputargumenter

Når vi vil sende inputargumenter fra Gradle CLI, har vi to valg:

  • indstilling af systemegenskaber med -D flag
  • indstilling af projektegenskaber med -P flag

Generelt, vi skal bruge projektegenskaber, medmindre vi vil tilpasse indstillingerne i JVM.

Selvom det er muligt at kapre systemegenskaber for at videregive vores input, bør vi undgå at gøre dette.

Lad os se disse egenskaber i aktion. Først konfigurerer vi vores build.gradle:

anvend plugin: "java" beskrivelse = "Gradle kommandolinjeargumenter eksempler" task propertyTypes () {doLast {if (project.hasProperty ("args")) {println "Vores inputargument med projektegenskab [" + project.getProperty (" args ") +"] "} println" Vores inputargument med systemegenskab ["+ System.getProperty (" args ") +"] "}} 

Bemærk, at vi læser dem forskelligt i vores opgave.

Vi gør dette fordi projekt.getProperty () kaster en Mangler ejendomsundtagelse hvis vores ejendom ikke er defineret.

I modsætning til projektegenskaber, System.getProperty () returnerer a nul værdi, hvis ejendommen ikke er defineret.

Lad os derefter køre opgaven og se dens output:

$ ./gradlew propertyTypes -Dargs = lorem -Pargs = ipsum> Opgave: cmd-line-args: propertyTypes Vores inputargument med projektegenskab [ipsum] Vores inputargument med systemegenskab [lorem] 

3. Videregivelse af kommandolinjeargumenter

Indtil videre har vi set, hvordan man læser egenskaberne. I praksis er vi nødt til at sende disse egenskaber som argumenter til vores valgte program.

3.1. Videregivelse af argumenter til Java-applikationer

I en tidligere tutorial forklarede vi, hvordan du kører Java-hovedklasser fra Gradle. Lad os bygge videre på det og se, hvordan vi også kan føre argumenter.

Lad os først brug applikations-pluginet i vores build.gradle:

anvende plugin: "java" anvende plugin: "application" beskrivelse = "Gradle Command Line Argumenter eksempler" // tidligere erklæringer ext.javaMain-applikation {mainClassName = javaMainClass} 

Lad os nu se på vores hovedklasse:

public class MainClass {public static void main (String [] args) {System.out.println ("Eksempel på Gradle kommandolinjeargumenter"); for (String arg: args) {System.out.println ("Fik argument [" + arg + "]"); }}} 

Lad os derefter køre det med nogle argumenter:

$ ./gradlew: cmd-line-args: run --args = "lorem ipsum dolor"> Opgave: cmd-line-args: run Gradle kommandolinjeargumenter eksempel Fik argument [lorem] Fik argument [ipsum] Fik argument [dolor ]

Her bruger vi ikke egenskaber til at overføre argumenter. I stedet, vi passerer –Arker flag og de tilsvarende indgange der.

Dette er en dejlig indpakning leveret af applikations-pluginet. Imidlertid, dette er kun tilgængeligt fra Gradle 4.9 og fremefter.

Lad os se, hvordan dette ville se ud ved hjælp af en JavaExec opgave.

Først skal vi definere det i vores build.gradle:

ext.javaMain if (project.hasProperty ("args")) {ext.cmdargs = project.getProperty ("args")} ellers {ext.cmdargs = ""} task cmdLineJavaExec (type: JavaExec) {group = "Execution" beskrivelse = "Kør hovedklassen med JavaExecTask" classpath = sourceSets.main.runtimeClasspath main = javaMainClass args cmdargs.split ()} 

Lad os se nærmere på, hvad vi gjorde. Vi først læse argumenterne fra en projektegenskab.

Da dette indeholder alle argumenterne som en streng, vi derefter brug dele metode til at opnå en række argumenter.

Næste, vi videregive denne matrix til argumenterer vores ejendom JavaExec opgave.

Lad os se, hvad der sker, når vi kører denne opgave og sender projektegenskaber med -P mulighed:

$ ./gradlew cmdLineJavaExec -Pargs = "lorem ipsum dolor"> Opgave: cmd-line-args: cmdLineJavaExec Gradle kommandolinjeargumenter eksempel Fik argument [lorem] Fik argument [ipsum] Fik argument [dolor] 

3.2. Videregivelse af argumenter til andre applikationer

I nogle tilfælde vil vi måske videregive nogle argumenter til en tredjepartsapplikation fra Gradle.

Heldigvis kan vi brug det mere generiske Exec opgave for at gøre det:

hvis (project.hasProperty ("args")) {ext.cmdargs = project.getProperty ("args")} ellers {ext.cmdargs = "ls"} opgave cmdLineExec (type: Exec) {group = "Execution" beskrivelse = "Kør et eksternt program med ExecTask" commandLine cmdargs.split ()} 

Her, vi brug kommandolinje egenskaben til opgaven at videregive den eksekverbare sammen med eventuelle argumenter. Igen deler vi input baseret på mellemrum.

Lad os se, hvordan du kører dette til ls kommando:

$ ./gradlew cmdLineExec -Pargs = "ls -ll"> Opgave: cmd-line-args: cmdLineExec i alt 4 drwxr-xr-x 1 bruger 1049089 0 Sep 1 17:59 bin drwxr-xr-x 1 bruger 1049089 0 Sep 1 18:30 build -rw-r - r-- 1 bruger 1049089 1016 sep 3 15:32 build.gradle drwxr-xr-x 1 bruger 1049089 0 sep 1 17:52 src

Dette kan være ret nyttigt, hvis vi ikke ønsker at hardkode den eksekverbare fil i opgaven.

4. Konklusion

I denne hurtige vejledning så vi, hvordan vi sendte inputargumenter fra Gradle.

Først forklarede vi de typer egenskaber, vi kan bruge. Selvom vi kan bruge systemegenskaber til at sende inputargumenter, bør vi i stedet foretrække projektegenskaber.

Derefter undersøgte vi forskellige tilgange til videregivelse af kommandolinjeargumenter til Java eller eksterne applikationer.

Som sædvanlig kan den komplette kode findes på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found