2011-04-07 13 views
34

मैं एक प्रकार का सीएलआई विकल्प कैसे दे सकता हूं - जैसे int या Integer? (बाद में, मैं एक फ़ंक्शन कॉल के साथ पार्स किए गए मान को कैसे प्राप्त कर सकता हूं?) Xzx8 अपाचे कॉमन्स सीएलआई - विकल्प प्रकार और डिफ़ॉल्ट मान

मैं एक सीएलआई विकल्प को डिफ़ॉल्ट मान कैसे दे सकता हूं? इस प्रकार CommandLine.getOptionValue() या उपरोक्त वर्णित फ़ंक्शन कॉल उस मान को वापस लौटाता है जब तक कि कमांड लाइन पर निर्दिष्ट नहीं किया जाता है?

उत्तर

43

संपादित के रूप में पार्स विकल्प मान प्राप्त कर सकते हैं: डिफ़ॉल्ट मान अब समर्थित हैं। नीचे https://stackoverflow.com/a/14309108/1082541 उत्तर देखें।

ब्रेंट Worden पहले से ही उल्लेख किया है, मूलभूत मूल्यों समर्थित नहीं हैं।

मैं Option.setType भी उपयोग करने के साथ मुद्दों था। मैं हमेशा एक नल पॉइंटर एक्सेप्शन जब प्रकार Integer.class साथ एक विकल्प पर getParsedOptionValue बुला मिला है। क्योंकि प्रलेखन वास्तव में सहायक नहीं था क्योंकि मैंने स्रोत कोड में देखा।

TypeHandler वर्ग को देखते हुए और PatternOptionBuilder वर्ग आप देख सकते हैं कि Number.classint या Integer के लिए इस्तेमाल किया जाना चाहिए।

CommandLineParser cmdLineParser = new PosixParser(); 

Options options = new Options(); 
options.addOption(OptionBuilder.withLongOpt("integer-option") 
         .withDescription("description") 
         .withType(Number.class) 
         .hasArg() 
         .withArgName("argname") 
         .create()); 

try { 
    CommandLine cmdLine = cmdLineParser.parse(options, args); 

    int value = 0; // initialize to some meaningful default value 
    if (cmdLine.hasOption("integer-option")) { 
     value = ((Number)cmdLine.getParsedOptionValue("integer-option")).intValue(); 
    } 

    System.out.println(value); 
} catch (ParseException e) { 
    e.printStackTrace(); 
} 

ध्यान रखें कि यदि एक संख्या है जो एक int में फ़िट नहीं होता प्रदान की जाती है कि value अतिप्रवाह कर सकते हैं:

और यहाँ एक सरल उदाहरण है।

+8

उदाहरण के लिए धन्यवाद, यह वही है जो मुझे चाहिए। हालांकि, मैंने सीएलआई के खिलाफ फैसला किया है: यह बहुत अधिक काम है। हो सकता है कि यह सिर्फ मुझे है, लेकिन जब आपको आम मामलों को संभालना होता है तो मुझे यह आत्म-पराजित लगता है। पर्याप्त सेटअप कोड के साथ, मुझे बस 'int foo = getOption ("foo") कहने में सक्षम होना चाहिए और यदि कुछ भी गलत हो तो इसे 42 तक डिफ़ॉल्ट कर दें। – aib

+1

हाँ, आप सही हैं।मुझे यह भी लगता है कि पुस्तकालय को इस सामान को संभालना चाहिए। कौन सा विकल्प पार्सिंग लाइब्रेरी आप इसके बजाय सिफारिश कर सकते हैं ?? –

+0

मैं जावा दुनिया में नया हूं। यह पहला था जिसकी मैंने कोशिश की, और मैं किसी और के बारे में नहीं जानता। शायद आपको इसे एक प्रश्न के रूप में पोस्ट करना चाहिए? 'संख्या.क्लास' चीज़ को इंगित करने के लिए – aib

1

CLI मूलभूत मूल्यों का समर्थन नहीं करता। getOptionValue में null लौटने पर कोई भी अनसेट विकल्प परिणाम।

आप Option.setType पद्धति का उपयोग करके विकल्प प्रकार निर्दिष्ट और उस प्रकार का उपयोग CommandLine.getParsedOptionValue

+0

के एक चर देना होगा मैं setType() और getParsedOptionValue के अस्तित्व के बारे में पता कर रहा हूँ:

options = new Options(); Option minOpt = Option.builder("min").hasArg().build(); minOpt.setType(Number.class); options.addOption(minOpt); 

और इसे पढ़ने: यह अब इस तरह की कुछ कोड की आवश्यकता है(), लेकिन उन्हें पता नहीं है कि उनका उपयोग कैसे करें। क्या आप मुझे एक छोटा सा उदाहरण दे सकते हैं? – aib

23

मैं अगर काम नहीं कर रहा है या अगर हाल ही में जोड़ा पता नहीं है लेकिन getOptionValue() एक ओवरलोड संस्करण (स्ट्रिंग) मूल्य

+0

यह वही है जो मुझे 2 साल पहले की आवश्यकता थी :) – aib

+0

@ एआईबी: खुशी हुई इससे मदद मिली - क्या यह तब अस्तित्व में था? –

+0

मुझे नहीं लगता, अन्यथा मैंने इसे देखा होगा। (या यहां कोई और, कम से कम।) – aib

1

कि एक डिफ़ॉल्ट स्वीकार करता है OptionBuilder संस्करण में हटा दिया गया है 1.3 & 1.4 और Option.Builder नहीं करता ' प्रतीत होता है कि टाइप को सेट करने के लिए सीधा फ़ंक्शन नहीं है। Option वर्ग के लिए setType नामक एक फ़ंक्शन है। आप फ़ंक्शन CommandLine.getParsedOptionValue फ़ंक्शन के साथ एक परिवर्तित मान पुनर्प्राप्त कर सकते हैं। यह सुनिश्चित नहीं है कि यह अब निर्माता का हिस्सा क्यों नहीं है।

String testInput = "-min 14"; 
    String[] splitInput = testInput.split("\\s+"); 

    CommandLine cmd = CLparser.parse(options, splitInput); 
    System.out.println(cmd.getParsedOptionValue("min")); 

किस प्रकार Long

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