2014-12-22 7 views
45

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

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

मैं gradle run -h चल की कोशिश की है और यह काम नहीं करता:

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. 

Gradle काम की तरह लग रहा है।

+0

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

+1

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

+0

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

उत्तर

21

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

मैं करने के लिए @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 
0

आप परियोजना गुण का उपयोग कर कार्य करने के लिए args के रूप में उन्हें पारित करने के लिए की जरूरत है, कुछ की तरह:

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

अपने कार्य परिभाषा को जोड़ा गया तो

(dsl docs देखें) आप के रूप में यह चला सकते हैं:

gradle -Ph run 
6

आप Problems passing system properties and parameters when running Java class via Gradle में समाधान पा सकते हैं। दोनों args संपत्ति के इस्तेमाल को शामिल

इसके अलावा, आप है कि समझाया in the Gradle documentation

+0

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

47

मैं एक ही मुद्दा था और build.gradle के लिए निम्न जोड़कर इसे हल करने में कामयाब रहे -D साथ या -P साथ गुजर के बीच अंतर को पढ़ना चाहिए:

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

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

+4

यह उत्तर केवल सहायक नहीं था, यह सबसे आसान था। –

8

आप हर समय बहस का एक ही सेट का उपयोग करना चाहते हैं, तो निम्न है आप सभी की जरूरत।

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

बेशक सब से ऊपर जवाब काम करते हैं, लेकिन फिर भी मैं की तरह

gradle run path1 path2 

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

gralde run --- path1 path2 

अगर आपको लगता है इसे और अधिक सुंदर है, तो आप यह कर सकते हैं, चाल कमांड लाइन की प्रक्रिया है और यह पहले Gradle करता है संशोधित करने के लिए है, इस init scripts

का उपयोग करके किया जा सकता है

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

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

तो (या 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 
+1

यह बहुत अच्छा काम करता है ... यदि मेरे तर्कों में से कोई भी डैश से शुरू नहीं होता है। यह आम [कमांड लाइन पार्सर्स] (https://commons.apache.org/proper/commons-cli/usage.html) के लिए बेकार बनाता है :(। जैसे ही ऐसा होता है, धीरे-धीरे उस तर्क को तर्क के रूप में मानते हैं धीरे-धीरे (मुझे नहीं लगता कि 'argsI.remove()' वांछित प्रभाव हो रहा है)। सुझाव? – Krease

संबंधित मुद्दे