ग्रेड कार्य - जावा आवेदन के लिए तर्क पास करें


127

मेरे पास एक जावा एप्लिकेशन है जो एक कस्टम ग्रेडल कार्य के साथ चलता है और आवेदन को लागू होने पर कुछ तर्कों की आवश्यकता होती है। य़े हैं:

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.

ग्रेडल कार्य जैसा दिखता है:

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

मैंने दौड़ने की कोशिश की है gradle run -hऔर यह काम नहीं करता है।


क्या उत्तर आपकी आवश्यकताओं के अनुरूप थे? यदि हां, तो आपको समाधान के रूप में एक को चिह्नित करना चाहिए।
फ्रांसिस्को जे। लोपेज-पेलिसर

1
वास्तव में नहीं ... एक दोस्त और मैंने इसे करने का एक तरीका खोजा, लेकिन हमारे पास अभी तक यह स्पष्ट नहीं है कि एक समाधान प्रकाशित करने के लिए, दोनों प्रस्तावित समाधानों की कोशिश की गई थी, हमने समझा कि यह क्या किया जाना चाहिए, लेकिन नहीं किया ' t वास्तव में काम करने लगते हैं ...
RecuencoJones

@ 6uitar6reat6od अंत में आपने इसे कैसे हल किया? इसके अलावा, क्या संस्करण है?
xlm

जवाबों:


80

ग्रैडल 4.9 के बाद से, कमांड लाइन तर्कों को --args के साथ पारित किया जा सकता है। उदाहरण के लिए, यदि आप कमांड लाइन तर्कों के साथ एप्लिकेशन लॉन्च करना चाहते हैं, तो आप foo --barउपयोग कर सकते हैं

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

इसके अलावा ग्रैड एप्लिकेशन प्लगिन देखें

ग्रैडल रैपर को अपग्रेड कैसे करें


1
क्या 'अपेक्षित या एक टाइपो' है? क्या सभी तर्कों को एक एकल उद्धरण द्वारा सीमांकित स्ट्रिंग के रूप में पारित किया जाना चाहिए?
RecuencoJones

प्रति @RecuencoJones फिक्स्ड docs.gradle.org/current/userguide/...
ड्रयू स्टीफंस

1
gradle run --args = 'foo --bar'
जिम फ्लड

3
'foo --bar'भ्रामक है, सिर्फ उपयोग क्यों नहीं 'foo bar'
एरिक वांग

4
@ EricWang ये मनमानी कमांड लाइन तर्क हैं जिन्हें एक कार्यक्रम की आवश्यकता हो सकती है। यह दिखाना अच्छा है कि अंतर्ग्रहण किसी भी प्रकार के तर्कों का समर्थन करता है, क्योंकि कच्ची स्ट्रिंग निर्मित एप्लिकेशन को पास की जाती है।
जोफ्री

100

गाद 4.9+

gradle run --args='arg1 arg2'

यह मानता है कि आपके एप्लिकेशन प्लगइन केbuild.gradle साथ कॉन्फ़िगर किया गया है । आपको इसके समान दिखना चाहिए:build.gradle

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

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

प्री-ग्रैडल 4.9

निम्नलिखित को अपने में शामिल करें build.gradle:

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

फिर चलाने के लिए: gradle run -PappArgs="['arg1', 'args2']"


7
यह उत्तर केवल सहायक नहीं था, यह सबसे सरल था।
जॉसी काल्डेरन

अपने अपडेट के लिए अपडेट करें: gradle run --args 'arg1 arg2'मेरे लिए काम नहीं किया। मुझे करना था:gradle run --args='arg1 arg2'
खरीदारों

@ सेमी खरीदारों को पकड़ने के लिए धन्यवाद! मैंने अपना अपडेट
xlm

28

इतनी देर से जवाब देने के लिए क्षमा करें।

मुझे @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
}

और जैसे आह्वान करें:

gradle run -Pmyargs=-d,s

28

यदि आप हर समय एक ही तर्क का उपयोग करना चाहते हैं, तो निम्नलिखित सभी की आवश्यकता है।

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

2
ठीक है, मेरे जैसे पूर्ण शुरुआती लोगों के लिए: रन बनाने वाले कार्य को परिभाषित करने में सक्षम होने के लिए आपका बिल्ड.ग्रेड दो पंक्तियों में निम्नलिखित होना चाहिए: प्लगइन लागू करें: 'एप्लीकेशन' mainClassName = "<पैकेज क्लास सहित पूरा क्लासनाम>" अन्यथा, आप परिभाषित नहीं कर सकते रन विधि मे buuild.gradle
mk ..

1
मैं id 'application'प्लगइन का उपयोग कर रहा हूं और यह वह उत्तर था जिसकी मुझे आवश्यकता थी (यह काम करता है)।
बिग रिच

6

ग्रैडल के माध्यम से जावा वर्ग को चलाने पर आप सिस्टम पासिंग प्रॉपर्टीज और पैरामीटर्स में समस्याओं का समाधान पा सकते हैं । दोनों का उपयोग शामिल हैargs संपत्ति

साथ ही आपको ग्रैडल डॉक्यूमेंटेशन में बताया गया है कि -Dउसके साथ या उसके बीच के अंतर को पढ़ना चाहिए-P


यह भी देखा। अभी भी देख रहा है। इन सभी विधियों से लगता है कि वे वर्तमान गुणों को संपादित / मालिश करना चाहते हैं और उन्हें पास करना चाहते हैं। किसी एप्लिकेशन या सेवा को चलाने के लिए कमांड लाइन और जावा गुण "संदर्भ" या "कॉन्फ़िगरेशन" सेटिंग के समान हैं। बेहतर होगा कि प्लग-इन किया जाए जो "रन पैरामीटर" जैसी चीजों को साइड-बाय-साइड प्रोफाइल या कुछ और के रूप में करता है।
होगा

5

बेशक ऊपर दिए गए जवाब सभी काम करते हैं, लेकिन फिर भी मैं कुछ का उपयोग करना चाहूंगा

gradle run path1 path2

अच्छी तरह से यह नहीं किया जा सकता है, लेकिन अगर हम कर सकते हैं:

gralde run --- path1 path2

यदि आपको लगता है कि यह अधिक सुरुचिपूर्ण है, तो आप इसे कर सकते हैं, चाल कमांड लाइन को संसाधित करने और इसे करने से पहले इसे संशोधित करना है, यह init स्क्रिप्ट का उपयोग करके किया जा सकता है

नीचे init स्क्रिप्ट:

  1. कमांड लाइन को प्रोसेस करें और '---' के बाद --- और अन्य सभी तर्कों को हटा दें।
  2. Gradle.ext में प्रॉपर्टी 'appArgs' जोड़ें

तो अपने रन टास्क (या JavaExec, Exec) में आप कर सकते हैं:

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

                args appArgs

 }

Init स्क्रिप्ट है:

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

सीमाएं:

  1. मुझे '---' का उपयोग करने के लिए मजबूर किया गया था और '-' नहीं
  2. आपको कुछ वैश्विक init स्क्रिप्ट को जोड़ना होगा

यदि आपको वैश्विक init स्क्रिप्ट पसंद नहीं है, तो आप इसे कमांड लाइन में निर्दिष्ट कर सकते हैं

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

या बेहतर रूप से अपने शेल में एक उपनाम जोड़ें:

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

2
यह बहुत अच्छा काम करता है ... अगर मेरी कोई भी दलील शुरू नहीं होती है। यह सामान्य कमांड लाइन पार्सर्स के लिए बेकार बना देता है :( जैसे ही ऐसा होता है, ग्रेडेल को उस तर्क को ग्रेडिंग के तर्क के रूप में माना जाता है (मुझे नहीं लगता कि argsI.remove()यह वांछित प्रभाव है)
क्रीज

3

आपको argsप्रोजेक्ट प्रॉपर्टी का उपयोग करके उन्हें कार्य के रूप में पास करना होगा , जैसे कुछ:

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

आपकी कार्य परिभाषा में जोड़ा गया ( dsl डॉक्स देखें )

तो आप इसे निम्नानुसार चला सकते हैं:

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