Attività Gradle: passa argomenti all'applicazione Java


127

Ho un'applicazione Java che viene eseguita con un'attività gradle personalizzata e l'applicazione richiede alcuni argomenti quando viene richiamata. Questi sono:

programName ( string | -f filename | -d key | -h)
Options:
    string         Message to be used.
    -d key         Use default messages, key must be s[hort], m[edium] or l[ong].
    -f filename    Use specified file as input.
    -h             Help dialog.

L'attività Gradle ha questo aspetto:

task run (type: JavaExec){
    description = "Secure algorythm testing"
    main = 'main.Test'
    classpath = sourceSets.main.runtimeClasspath
}

Ho provato a correre gradle run -he non funziona.


Le risposte rispondevano alle tue esigenze? In tal caso, contrassegnarne uno come soluzione.
Francisco J. Lopez-Pellicer

1
Non proprio ... io e un amico abbiamo scoperto un modo per farlo ma ancora non lo abbiamo chiaro per poter pubblicare una soluzione, sono state provate entrambe le soluzioni proposte, abbiamo capito cosa si doveva fare, ma non l'abbiamo fatto ' Sembra che funzioni davvero ...
RecuencoJones

@ 6uitar6reat6od Come hai risolto alla fine? Inoltre quale versione di gradle?
xlm

Risposte:


80

A partire da Gradle 4.9, gli argomenti della riga di comando possono essere passati con --args. Ad esempio, se vuoi avviare l'applicazione con argomenti della riga di comando foo --bar, puoi usare

gradle run --args = 'foo --bar'

Vedi anche Plugin dell'applicazione Gradle

Come aggiornare Gradle wrapper


1
È l 'atteso o un errore di battitura? Tutti gli argomenti devono essere passati come una stringa delimitata da virgolette singole?
RecuencoJones


1
gradle run --args = 'foo --bar'
Jim Flood il

3
'foo --bar'è fonte di confusione, perché non basta usare 'foo bar'.
Eric Wang

4
@EricWang Questi sono argomenti arbitrari della riga di comando che un programma potrebbe richiedere. È bello mostrare che gradle supporta qualsiasi tipo di argomento, poiché la stringa non elaborata viene passata all'applicazione compilata.
Joffrey

100

Gradle 4.9+

gradle run --args='arg1 arg2'

Ciò presuppone che tu build.gradlesia configurato con il plug-in dell'applicazione . Il tuo build.gradledovrebbe essere simile a questo:

plugins {
  // Implicitly applies Java plugin
  id: 'application'
}

application {
  // URI of your main class/application's entry point (required)
  mainClassName = 'org.gradle.sample.Main'
}

Pre-Gradle 4.9

Includere quanto segue nel tuo build.gradle:

run {
    if (project.hasProperty("appArgs")) {
        args Eval.me(appArgs)
    }
}

Quindi per eseguire: gradle run -PappArgs="['arg1', 'args2']"


7
Questa risposta non è stata solo utile, è stata anche la più semplice.
Jossie Calderon

Aggiornamento per il tuo aggiornamento: gradle run --args 'arg1 arg2'non ha funzionato per me. Ho dovuto fare:gradle run --args='arg1 arg2'
cmyers

@cmyers grazie per averlo capito! Ho aggiornato il mio aggiornamento
xlm

28

Scusa per aver risposto così tardi.

Ho pensato una risposta simile a quella di @xlm:

task run (type: JavaExec, dependsOn: classes){
    if(project.hasProperty('myargs')){
        args(myargs.split(','))
    }
    description = "Secure algorythm testing"
    main = "main.Test"
    classpath = sourceSets.main.runtimeClasspath
}

E invoca come:

gradle run -Pmyargs=-d,s

28

Se vuoi usare sempre lo stesso insieme di argomenti, quanto segue è tutto ciò di cui hai bisogno.

run {
    args = ["--myarg1", "--myarg2"]
}

2
Ok, per i principianti assoluti come me: per poter definire l'attività di esecuzione il tuo build.gradle dovrebbe contenere le seguenti due righe: apply plugin: 'application' mainClassName = "<nome classe completo incluso il percorso del pacchetto>" Altrimenti, non puoi definire il metodo di esecuzione in buuild.gradle
mk ..

1
Sto usando il id 'application'plugin e questa era la risposta di cui avevo bisogno (funziona).
Big Rich

6

Puoi trovare la soluzione in Problemi di passaggio di proprietà e parametri di sistema durante l'esecuzione della classe Java tramite Gradle . Entrambi comportano l'uso della argsproprietà

Inoltre dovresti leggere la differenza tra passare con -Do con -Pquello è spiegato nella documentazione di Gradle


Ho visto anche questo. Ancora in cerca. Tutti questi metodi sembrano voler modificare / massaggiare le proprietà correnti e trasmetterle. La riga di comando e le proprietà Java per l'esecuzione di un'applicazione o di un servizio sono simili all'impostazione "Contesto" o "Configurazione". Sarebbe meglio avere un plug-in che faccia cose come "parametri di esecuzione" come profili fianco a fianco o qualcosa del genere.
sarà

5

Ovviamente le risposte fanno soprattutto il lavoro, ma comunque vorrei usare qualcosa di simile

gradle run path1 path2

beh, questo non può essere fatto, ma cosa succede se possiamo:

gralde run --- path1 path2

Se pensi che sia più elegante, allora puoi farlo, il trucco è elaborare la riga di comando e modificarla prima che lo faccia gradle, questo può essere fatto usando script di inizializzazione

Lo script di inizializzazione di seguito:

  1. Elabora la riga di comando e rimuovi --- e tutti gli altri argomenti che seguono '---'
  2. Aggiungi la proprietà 'appArgs' a gradle.ext

Quindi nella tua attività di esecuzione (o JavaExec, Exec) puoi:

if (project.gradle.hasProperty("appArgs")) {
                List<String> appArgs = project.gradle.appArgs;

                args appArgs

 }

Lo script di inizializzazione è:

import org.gradle.api.invocation.Gradle

Gradle aGradle = gradle

StartParameter startParameter = aGradle.startParameter

List tasks = startParameter.getTaskRequests();

List<String> appArgs = new ArrayList<>()

tasks.forEach {
   List<String> args = it.getArgs();


   Iterator<String> argsI = args.iterator();

   while (argsI.hasNext()) {

      String arg = argsI.next();

      // remove '---' and all that follow
      if (arg == "---") {
         argsI.remove();

         while (argsI.hasNext()) {

            arg = argsI.next();

            // and add it to appArgs
            appArgs.add(arg);

            argsI.remove();

        }
    }
}

}


   aGradle.ext.appArgs = appArgs

limitazioni:

  1. Sono stato costretto a usare "---" e non "-"
  2. Devi aggiungere qualche script di inizializzazione globale

Se non ti piace lo script di inizializzazione globale, puoi specificarlo nella riga di comando

gradle -I init.gradle run --- f:/temp/x.xml

O meglio aggiungi un alias alla tua shell:

gradleapp run --- f:/temp/x.xml

2
Funziona alla grande ... se nessuno dei miei argomenti inizia con un trattino. Questo lo rende inutile per i comuni parser da riga di comando :(. Non appena ciò accade, gradle sembra trattare quell'argomento come un argomento per gradle (non credo che argsI.remove()stia avendo l'effetto desiderato). Suggerimenti?
Krease

3

Devi passarli come args all'attività utilizzando le proprietà del progetto, qualcosa come:

args = [project.property('h')]

aggiunto alla definizione dell'attività (vedere la documentazione dsl )

Quindi puoi eseguirlo come:

gradle -Ph run
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.