कमांड लाइन से तर्क के लिए तर्क कैसे पारित करें


105

मैं कमांड लाइन से जावा क्लास में एक तर्क पारित करने की कोशिश कर रहा हूं। मैंने इस पोस्ट का अनुसरण किया: http://gradle.1045684.n5.nabble.com/Gradle-application-plugin-question-td5539555.html लेकिन कोड मेरे लिए काम नहीं करता है (शायद यह JavaExec के लिए नहीं है?)। यहाँ मैं कोशिश की है:

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

उपरोक्त हार्ड कोडित आर्ग्स वैल्यू से आउटपुट है:

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

हालाँकि, एक बार जब मैं hasProperty अनुभाग का उपयोग करने के लिए कोड को बदल देता हूं और कमांड लाइन पर एक तर्क के रूप में "डेमो" पास करता हूं, तो मुझे 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) 

Http://gradle.1045684.n5.nabble.com/file/n5709919/testgradle.zip पर एक सरल परीक्षण परियोजना उपलब्ध है जो समस्या का चित्रण करती है।

यह ग्रैडल 1.0-आरसी -3 का उपयोग कर रहा है। NullPointer कोड की इस पंक्ति से है:

args group 

मैंने टास्क डेफिनिशन से पहले निम्नलिखित असाइनमेंट जोड़े थे, लेकिन इसने परिणाम को नहीं बदला:

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

सराहना करने के लिए कमांड लाइन तर्कों को पारित करने के तरीके पर कोई संकेत।


TNX एक बहुत @ जोशुआ गोल्डबर्ग। एक तर्क के लिए नमूना: stackoverflow.com/a/58202665/2201814
MHSFisher

जवाबों:


63

project.groupएक पूर्वनिर्धारित संपत्ति है। इसके साथ -P, आप केवल प्रोजेक्ट गुण सेट कर सकते हैं जो पूर्वनिर्धारित नहीं हैं । वैकल्पिक रूप से, आप जावा सिस्टम गुण ( -D) सेट कर सकते हैं ।


3
मुझे बताने के लिए धन्यवाद! TestngGroup में नाम बदलने से समस्या ठीक हो गई। तालिका 13.1 में पूर्वनिर्धारित गुणों की एक सूची gradle.org/docs/current/userguide/writing_build_scripts.html पर मिली
लिडिया

2
बस लिंक को अपडेट करने के लिए: docs.gradle.org/current/userguide/…
Kikiwa

56

पीटर एन के उत्तर पर निर्माण, यह एक उदाहरण है कि जावा मुख्य कार्य के लिए जावा मुख्य में पास होने के लिए (वैकल्पिक) उपयोगकर्ता-निर्दिष्ट तर्क कैसे जोड़े जाएं (क्योंकि आप जिस कारण का हवाला देते हैं, उसके लिए मैन्युअल रूप से 'आर्ग' संपत्ति सेट नहीं कर सकते।)

इसे कार्य में जोड़ें:

task(runProgram, type: JavaExec) {

  [...]

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

... और इस तरह कमांड लाइन पर चलाएं

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

2
मैं अलग पैरामीटर होने के बारे में कैसे जा सकता हूं? जैसे: gradle run -Purl='localhost', -Pport='8080', -Pusername='admin' build.gradle में मेरा कोड कैसा दिखना चाहिए?
टॉमस

@ टॉमस मैं सुझाव दे सकता हूं कि उसके लिए एक शीर्ष स्तर के प्रश्न का उत्तर दें। (मैं उस स्थिति को अच्छी तरह से अपने आप को, यहाँ वैसे भी त्वरित इनलाइन उत्तर देने के लिए नहीं जानता।)
जोशुआ गोल्डबर्ग

1
कोई चिंता नहीं, यह पहले से ही किया था और यहाँ पर
टॉमस

28

दो तर्कों के साथ मेरा कार्यक्रम, [0] और 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

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

मेरा टर्मिनल प्रॉम्प्ट:

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

17

ग्रैडल 4.9 के रूप में एप्लिकेशन प्लगइन --argsविकल्प को समझता है, इसलिए तर्क पारित करना उतना ही सरल है:

build.gradle

plugins {
    id 'application'
}

mainClassName = "my.App"

src / मुख्य / जावा / मेरी / App.java

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

दे घुमा के

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

15

ग्रेडेल में कस्टम कमांड लाइन विकल्पों का उपयोग करना संभव है, जैसे कि कुछ के साथ समाप्त करने के लिए:

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

हालांकि, ग्रैडल में कस्टम कमांड लाइन विकल्प एक ऊष्मायन सुविधा है

जावा समाधान

कुछ इस तरह से समाप्त करने के लिए यहां दिए गए निर्देशों का पालन करें :

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

फिर इसे पंजीकृत करें:

task printPet(type: PrintPet)

अब आप कर सकते हैं:

./gradlew printPet --pet="puppies"

उत्पादन:

पिल्ले! ये अद्भुत हैं!

कोटलिन समाधान

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

इसके बाद कार्य को पंजीकृत करें:

tasks.register<PrintPet>("printPet")

5

यदि आपको एक तर्क की जाँच करने और सेट करने की आवश्यकता है , तो आपकी build.gradleफ़ाइल इस तरह होगी:

....

def coverageThreshold = 0.15

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

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

और खिड़कियों में नमूना आदेश:

gradlew clean test -Pthreshold = 0.25


4

मैंने कोड का एक टुकड़ा लिखा है जो कमांड लाइन के तर्कों को उस प्रारूप में डालता है जो ग्रेडेल की अपेक्षा रखता है।

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

मेरा काम इस तरह दिखता है:

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

कमांड लाइन से तर्क देने के लिए आप इसे चलाते हैं:

gradle runProgram -PcommandLineArgs="arg1 arg2 arg3 arg4"    

1

यहाँ एक बढ़िया उदाहरण है:

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

कौन सा विवरण आप मापदंडों को पारित कर सकते हैं और फिर एक विस्तृत चर में एक डिफ़ॉल्ट प्रदान कर सकते हैं जैसे:

gradle -Dmy_app.color=blue

और फिर ग्रेड के रूप में संदर्भ:

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

और फिर अपनी बिल्ड स्क्रिप्ट में कहीं भी आप इसे संदर्भित कर सकते हैं बेशक आप इसे कहीं भी संदर्भित कर सकते हैं project.ext.color

यहाँ और अधिक टिप्स: https://kb.novaordis.com/index.php/Gradle_Variables_and_Properties


-4

कमांड लाइन से एक url पास करें अपने url को ऐप ग्रेड फ़ाइल में रखें जैसा कि resValue "string", "url", CommonUrl

और gradle.properties फ़ाइलों में एक पैरामीटर दें जैसे कि CommonUrl = "अपना यूआरएल यहां डालें या खाली हो सकता है"

और कमांड लाइन से एक कमांड पास करें जैसे कि ग्रेडेल असेंबली टाइप करें -कॉममेनुरल = यहां अपना URL डालें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.