Cara meneruskan argumen dari baris perintah ke gradle

105

Saya mencoba untuk meneruskan argumen dari baris perintah ke kelas java. Saya mengikuti posting ini: http://gradle.1045684.n5.nabble.com/Gradle-application-plugin-question-td5539555.html tetapi kodenya tidak berfungsi untuk saya (mungkin itu tidak dimaksudkan untuk JavaExec?). Inilah yang saya coba:

task listTests(type:JavaExec){
    main = "util.TestGroupScanner"
    classpath = sourceSets.util.runtimeClasspath
    // this works...
    args 'demo'
    /*
    // this does not work!
    if (project.hasProperty("group")){
        args group
    }
    */
}

Output dari nilai args hard code di atas adalah:

C:\ws\svn\sqe\sandbox\selenium2forbg\testgradle>g listTests
:compileUtilJava UP-TO-DATE
:processUtilResources UP-TO-DATE
:utilClasses UP-TO-DATE
:listTests
Received argument: demo

BUILD SUCCESSFUL

Total time: 13.422 secs

Namun, setelah saya mengubah kode untuk menggunakan bagian hasProperty dan meneruskan "demo" sebagai argumen di baris perintah, saya mendapatkan NullPointerException:

C:\ws\svn\sqe\sandbox\selenium2forbg\testgradle>g listTests -Pgroup=demo -s

FAILURE: Build failed with an exception.

* Where:
Build file 'C:\ws\svn\sqe\sandbox\selenium2forbg\testgradle\build.gradle' line:25

* What went wrong:
A problem occurred evaluating root project 'testgradle'.
> java.lang.NullPointerException (no error message)

* Try:
Run with --info or --debug option to get more log output.

* Exception is:
org.gradle.api.GradleScriptException: A problem occurred evaluating root project
 'testgradle'.
    at org.gradle.groovy.scripts.internal.DefaultScriptRunnerFactory$ScriptRunnerImpl.run(DefaultScriptRunnerFactory.java:54)
    at org.gradle.configuration.DefaultScriptPluginFactory$ScriptPluginImpl.apply(DefaultScriptPluginFactory.java:127)
    at org.gradle.configuration.BuildScriptProcessor.evaluate(BuildScriptProcessor.java:38) 

Ada proyek uji sederhana yang tersedia di http://gradle.1045684.n5.nabble.com/file/n5709919/testgradle.zip yang menggambarkan masalah tersebut.

Ini menggunakan Gradle 1.0-rc-3. NullPointer berasal dari baris kode ini:

args group 

Saya menambahkan tugas berikut sebelum definisi tugas, tetapi itu tidak mengubah hasilnya:

group = hasProperty('group') ? group : 'nosuchgroup' 

Setiap petunjuk tentang cara meneruskan argumen baris perintah ke gradle dihargai.

Lidia
sumber
TNX banyak @Joshua Goldberg. sampel untuk satu argumen: stackoverflow.com/a/58202665/2201814
MHSFisher

Jawaban:

63

project.groupadalah properti yang telah ditentukan sebelumnya. Dengan -P, Anda hanya dapat menyetel properti proyek yang belum ditentukan sebelumnya. Alternatifnya, Anda bisa menyetel properti sistem Java ( -D).

Peter Niederwieser
sumber
3
Terima kasih telah memberi tahu saya! Mengubah nama menjadi testngGroup memperbaiki masalah. Menemukan daftar properti standar pada tabel 13.1 di gradle.org/docs/current/userguide/writing_build_scripts.html .
Lidia
2
Hanya untuk memperbarui link: docs.gradle.org/current/userguide/...
Kikiwa
56

Berdasarkan jawaban Peter N, ini adalah contoh cara menambahkan argumen yang ditentukan pengguna (opsional) untuk diteruskan ke utama Java untuk tugas JavaExec (karena Anda tidak dapat menyetel properti 'args' secara manual karena alasan yang dia kutip.)

Tambahkan ini ke tugas:

task(runProgram, type: JavaExec) {

  [...]

  if (project.hasProperty('myargs')) {
      args(myargs.split(','))
  }

... dan jalankan di baris perintah seperti ini

% ./gradlew runProgram '-Pmyargs=-x,7,--no-kidding,/Users/rogers/tests/file.txt'
Joshua Goldberg
sumber
2
Bagaimana saya bisa memiliki parameter terpisah? Misalnya: gradle run -Purl='localhost', -Pport='8080', -Pusername='admin' bagaimana tampilan kode saya di build.gradle?
Tomas
@Tomas Saya sarankan untuk menyempurnakan pertanyaan tingkat atas untuk itu. (Saya sendiri tidak tahu situasi itu dengan cukup baik untuk memberikan jawaban sebaris cepat di sini.)
Joshua Goldberg
1
Jangan khawatir, sudah melakukannya dan
Tomas
28

Program saya dengan dua argumen, args [0] dan args [1]:

public static void main(String[] args) throws Exception {
    System.out.println(args);
    String host = args[0];
    System.out.println(host);
    int port = Integer.parseInt(args[1]);

build.gradle saya

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

perintah terminal saya:

gradle run  -PappArgsWhatEverIWant="['localhost','8080']"
Oscar Raig Colon
sumber
17

Mulai dari Gradle 4.9, plugin Aplikasi memahami --argsopsi, jadi meneruskan argumen sesederhana:

build.gradle

plugins {
    id 'application'
}

mainClassName = "my.App"

src / main / java / my / App.java

public class App {
    public static void main(String[] args) {
        System.out.println(args);
    }
}

pesta

./gradlew run --args='This string will be passed into my.App#main arguments'
orang gila
sumber
15

Anda dapat menggunakan opsi baris perintah khusus di Gradle untuk menghasilkan sesuatu seperti:

./gradlew printPet --pet="puppies!"

Namun, opsi baris perintah kustom di Gradle adalah fitur inkubasi .

Solusi Java

Untuk mendapatkan hasil seperti ini, ikuti petunjuk di sini :

import org.gradle.api.tasks.options.Option;

public class PrintPet extends DefaultTask {
    private String pet;

    @Option(option = "pet", description = "Name of the cute pet you would like to print out!")
    public void setPet(String pet) {
        this.pet = pet;
    }

    @Input
    public String getPet() {
        return pet;
    }

    @TaskAction
    public void print() {
        getLogger().quiet("'{}' are awesome!", pet);
    }
}

Kemudian daftarkan:

task printPet(type: PrintPet)

Sekarang Anda dapat melakukan:

./gradlew printPet --pet="puppies"

keluaran:

Anak anjing! luar biasa!

Solusi Kotlin

open class PrintPet : DefaultTask() {

    @Suppress("UnstableApiUsage")
    @set:Option(option = "pet", description = "The cute pet you would like to print out")
    @get:Input
    var pet: String = ""

    @TaskAction
    fun print() {    
        println("$pet are awesome!")
    }
}

lalu daftarkan tugas dengan:

tasks.register<PrintPet>("printPet")
David Rawson
sumber
5

Jika Anda perlu memeriksa dan menetapkan satu argumen , build.gradlefile Anda akan seperti ini:

....

def coverageThreshold = 0.15

if (project.hasProperty('threshold')) {
    coverageThreshold = project.property('threshold').toString().toBigDecimal()
}

//print the value of variable
println("Coverage Threshold: $coverageThreshold")
...

Dan perintah Sample di windows:

tes bersih gradlew -Pthreshold = 0,25

MHSFisher
sumber
4

Saya telah menulis sepotong kode yang menempatkan argumen baris perintah dalam format yang diharapkan gradle.

// this method creates a command line arguments
def setCommandLineArguments(commandLineArgs) {
    // remove spaces 
    def arguments = commandLineArgs.tokenize()

            // create a string that can be used by Eval 
            def cla = "["
            // go through the list to get each argument
            arguments.each {
                    cla += "'" + "${it}" + "',"
            }

    // remove last "," add "]" and set the args 
    return cla.substring(0, cla.lastIndexOf(',')) + "]"
}

tugas saya terlihat seperti ini:

task runProgram(type: JavaExec) {
    if ( project.hasProperty("commandLineArgs") ) {
            args Eval.me( setCommandLineArguments(commandLineArgs) )
    }
}

Untuk meneruskan argumen dari baris perintah, Anda menjalankan ini:

gradle runProgram -PcommandLineArgs="arg1 arg2 arg3 arg4"    
Sebastian Musial
sumber
1

Ada contoh bagus di sini:

https://kb.novaordis.com/index.php/Gradle_Pass_Configuration_on_Command_Line

Detail mana yang dapat Anda berikan parameter dan kemudian berikan default dalam variabel ext seperti:

gradle -Dmy_app.color=blue

dan kemudian merujuk di Gradle sebagai:

ext {
   color = System.getProperty("my_app.color", "red");
}

Lalu di mana pun di skrip build Anda, Anda dapat mereferensikannya sebagai kursus di mana pun Anda dapat mereferensikannya project.ext.color

Lebih banyak tip di sini: https://kb.novaordis.com/index.php/Gradle_Variables_and_Properties

Matt Wolfe
sumber
-4

teruskan url dari baris perintah, pertahankan url Anda dalam file gradle aplikasi sebagai berikut resValue "string", "url", CommonUrl

dan beri parameter pada file gradle.properties sebagai berikut CommonUrl = "letakkan url Anda di sini atau mungkin kosong"

dan berikan perintah ke dari baris perintah sebagai berikut gradle assembleRelease -Pcommanurl = letakkan URL Anda di sini

Arun Kawdiya
sumber