Komut satırından gradle'a argümanlar nasıl geçirilir


105

Komut satırından java sınıfına bir argüman geçirmeye çalışıyorum. Bu gönderiyi takip ettim: http://gradle.1045684.n5.nabble.com/Gradle-application-plugin-question-td5539555.html ama kod benim için çalışmıyor (belki JavaExec için değil mi?). İşte denediğim şey:

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
    }
    */
}

Yukarıdaki sabit kodlu args değerinin çıktısı:

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

Ancak, hasProperty bölümünü kullanmak için kodu değiştirdiğimde ve komut satırında "demo" yu bir argüman olarak geçirdiğimde, bir NullPointerException alıyorum:

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) 

Sorunu gösteren http://gradle.1045684.n5.nabble.com/file/n5709919/testgradle.zip adresinde basit bir test projesi bulunmaktadır .

Bu Gradle 1.0-rc-3 kullanıyor. NullPointer bu kod satırındandır:

args group 

Görev tanımından önce aşağıdaki atamayı ekledim, ancak sonucu değiştirmedi:

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

Komut satırı argümanlarının nasıl derecelendirileceğine dair herhangi bir işaretçi takdir edilmektedir.


TNX çok @Joshua Goldberg. bir bağımsız değişken için örnek: stackoverflow.com/a/58202665/2201814
MHSFisher

Yanıtlar:


63

project.groupönceden tanımlanmış bir özelliktir. İle -P, sadece olduğunuz proje özelliklerini ayarlayabilirsiniz değil önceden. Alternatif olarak, Java sistem özelliklerini ( -D) ayarlayabilirsiniz .


3
Bilmeme izin verdiğin için teşekkürler! Adın testngGroup olarak değiştirilmesi sorunu çözdü. Gradle.org/docs/current/userguide/writing_build_scripts.html adresindeki tablo 13.1'de önceden tanımlanmış özelliklerin bir listesi bulundu .
Lidia

2
Sadece bağlantıyı güncellemek için: docs.gradle.org/current/userguide/…
Kikiwa

56

Peter N'nin cevabına dayanarak, bu, bir JavaExec görevi için Java main'e iletmek üzere kullanıcı tanımlı argümanların (isteğe bağlı) nasıl ekleneceğinin bir örneğidir (çünkü alıntı yaptığı nedenle 'args' özelliğini manuel olarak ayarlayamazsınız).

Bunu göreve ekleyin:

task(runProgram, type: JavaExec) {

  [...]

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

... ve bunun gibi komut satırında çalıştırın

% ./gradlew runProgram '-Pmyargs=-x,7,--no-kidding,/Users/rogers/tests/file.txt'

2
Ayrı parametrelere nasıl sahip olabilirim? Örneğin gradle run -Purl='localhost', -Pport='8080', -Pusername='admin' , build.gradle'daki kodum nasıl görünmeli?
Tomas

@Tomas, bunun için üst düzey bir soru sormayı öneririm. (Bu durumu burada kendim de hızlı bir satır içi yanıt verecek kadar iyi bilmiyorum.)
Joshua Goldberg

1
Endişeye gerek yok, zaten oldu mu ve burada
Tomas

28

İki bağımsız değişkenli programım, args [0] ve 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]);

benim build.gradle

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

terminal istemim:

gradle run  -PappArgsWhatEverIWant="['localhost','8080']"

17

Gradle 4.9 Uygulama eklentisi --argsseçeneği anladığından , argümanları iletmek şu kadar basittir:

build.gradle

plugins {
    id 'application'
}

mainClassName = "my.App"

src / main / java / benim / App.java

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

bash

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

16

Gradle'da özel komut satırı seçeneklerini kullanarak şunun gibi bir şey elde etmek mümkündür:

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

Ancak, Gradle'daki özel komut satırı seçenekleri kuluçkaya yatan bir özelliktir .

Java çözümü

Bu talimatları takip gibi bir şey ile bitirmek için buraya :

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);
    }
}

Ardından kaydedin:

task printPet(type: PrintPet)

Şimdi şunları yapabilirsiniz:

./gradlew printPet --pet="puppies"

çıktı:

Yavru köpekler! harikalar!

Kotlin çözümü

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!")
    }
}

ardından görevi şununla kaydedin:

tasks.register<PrintPet>("printPet")

5

Bir bağımsız değişken kontrol etmeniz ve ayarlamanız gerekirse , build.gradledosyanız şöyle olacaktır:

....

def coverageThreshold = 0.15

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

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

Ve pencerelerde Örnek komutu:

gradlew temiz testi -Pthreshold = 0.25


4

Komut satırı argümanlarını gradle'ın beklediği formatta yerleştiren bir kod parçası yazdım.

// 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(',')) + "]"
}

benim görevim şuna benziyor:

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

Bağımsız değişkenleri komut satırından geçirmek için şunu çalıştırın:

gradle runProgram -PcommandLineArgs="arg1 arg2 arg3 arg4"    

1

Burada harika bir örnek var:

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

Parametreleri iletebileceğiniz ve ardından bir ext değişkeninde aşağıdaki gibi bir varsayılan sağlayabileceğiniz ayrıntılar:

gradle -Dmy_app.color=blue

ve ardından Gradle'da şu şekilde referans alın:

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

Ve sonra, derleme komut dosyanızın herhangi bir yerinde, ona referans verebileceğiniz her yerde ders olarak başvurabilirsiniz. project.ext.color

Burada daha fazla ipucu: https://kb.novaordis.com/index.php/Gradle_Variables_and_Properties


-4

komut satırından bir url iletin url'nizi aşağıdaki gibi uygulama gradle dosyasında tutun iletin url'nizi tutun resValue "string", "url", CommonUrl

ve gradle.properties dosyalarında aşağıdaki gibi bir parametre verin CommonUrl = "url'nizi buraya koyun veya boş olabilir"

ve aşağıdaki gibi komut satırından bir komut iletin gradle assembleRelease -Pcommanurl = URL'nizi buraya koyun

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.