2013-06-18 3 views
25

एक सीएलआई के लिए, मुझे किसी विशेष विकल्प के लिए इनपुट के रूप में स्याही की एक सरणी में पास करने की आवश्यकता है।अपाचे कॉमन्स सीएलआई: एक विकल्प के लिए मूल्यों की सूची प्राप्त करना

उदाहरण - नीचे दिया गया आदेश ग्राहक आईडी की एक श्रृंखला में ले जाएगा और कुछ संचालन करेगा।

myCommand -c 123 124 125

मैं अपाचे कॉमन्स CLI का उपयोग कर CLI को लागू किया है, और मैं getOptionValues ​​उपयोग कर रहा हूँ ("सी") इस सरणी पुनः प्राप्त करने के।

समस्या यह है कि, यह सरणी में केवल पहला तत्व लौटा रहा है, यानी [123], जबकि मैं इसे वापस आने की उम्मीद कर रहा हूं [123, 124, 125]।

मेरे कोड का एक संक्षिप्त संस्करण,

CommandLine cmd; 
CommandLineParser parser = new BasicParser(); 
cmd = parser.parse(options, args); 
if (cmd.hasOption("c")){ 
String[] customerIdArray = cmd.getOptionValues("c"); 
// Code to parse data into int 
} 

कोई मुझे यहाँ समस्या को पहचानने में मदद कर सकते हैं?

उत्तर

24

आप अधिकतम तर्क की संख्या को महत्व देता है विकल्प ले जा सकते हैं स्थापित करने के लिए, अन्यथा यह मान लिया गया है विकल्प केवल 1 तर्क मान है है

Options options = new Options(); 
Option option = new Option("c", "c desc"); 
// Set option c to take maximum of 10 arguments 
option.setArgs(10); 
options.addOption(option); 
+3

और अगर तर्क मूल्यों की अधिकतम संख्या अज्ञात है की असीमित संख्या हो सकता है कि एक नया तरीका है CLI? क्या \t ब्रैकेट के साथ वाक्यविन्यास होना संभव है? – Zangdak

31

मैं @Zangdak के जवाब के रूप में यहाँ यह जोड़ना चाहते हैं और एक ही समस्या पर अपने निष्कर्ष जोड़ने के लिए।

यदि आप #setArgs(int) पर कॉल नहीं करते हैं तो एक रनटाइम अपवाद होगा। जब आप इस विकल्प के लिए अधिकतम अधिकतम तर्कों को जानते हैं, तो यह विशिष्ट मान सेट करें। Option.UNLIMITED_VALUES

यह gerrytans बदल जाएगा निम्नलिखित को जवाब:

Options options = new Options(); 
Option option = new Option("c", "c desc"); 
// Set option c to take 1 to oo arguments 
option.setArgs(Option.UNLIMITED_VALUES); 
options.addOption(option); 
+0

हां, मैंने जो किया लेकिन मैं सिंटैक्स को निम्न की तरह अधिक प्राप्त करना चाहता था: 'cmd -opt1 {V1 V2 ... Vn} arg 'लेकिन ऐसा लगता है कि अस्तित्व में नहीं है इसलिए मैं विकल्पों के पहले तर्कों को बस रखता हूं असीमित मूल्य – Zangdak

+1

@Zangdok अगर मैं आपको सही तरीके से समझता हूं, जो मुझे एक ही प्रश्न पर ले जाता है, तो UNLIMITED_VALUES के लिए यह सभी मानों के बाद कोई दूसरा विकल्प नहीं है। मैं पुष्टि कर सकता हूं कि 'cmd --opt = {V1 V2 ... Vn} -o --debug' कुछ काम कर रहा है – VeikkoW

+0

नहीं, असीमित मानों वाले विकल्पों के बाद एक और विकल्प अच्छी तरह से काम करता है। मैं इस तरह के विकल्प के बाद एक तर्क चाहता था। वैसे भी, मैं आपके वाक्यविन्यास का प्रयास करूंगा। – Zangdak

5

ऐसा लगता है कि मैं पार्टी लेकिन अपाचे के लिए थोड़ी देर हो चुकी हूँ जब यह मान ज्ञात नहीं है, वर्ग विकल्प इसके लिए एक निरंतर है कॉमन्स का विकास हुआ और अब (कम से कम 1.3.1 में) हम स्थापित करने के लिए तर्क

Option c = Option.builder("c") 
     .hasArgs() // sets that number of arguments is unlimited 
     .build(); 
     Options options = new Options(); 
     options.addOption(c); 
+1

का भी उपयोग कर सकते हैं यदि आप hasArgs() को कॉल कर रहे हैं तो hasArg() कॉल redundand है – jnowakow

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