5

मैंने दस्तावेज़ों को देखा है लेकिन यह नहीं देख सकता कि अपाचे कॉमन्स सीएलआई को डबल-हाइफ़न "विकल्प" को संभालने के लिए कैसे सामान्य रूप से विकल्प प्रसंस्करण को समाप्त किया जाता है। ,डबल-डैश को संभालने के लिए अपाचे सीएलआई कैसे प्राप्त करें?

MyProgram -opt -- param1 param2 

मैं विकल्प इस मामले में कोई तर्क के साथ खत्म करना चाहते हैं:

निम्नलिखित कमांड लाइन जो एक "-opt" विकल्प जो एक वैकल्पिक तर्क यह है कि निर्दिष्ट नहीं है ले सकते हैं पर विचार करें लेकिन अपाचे एक तर्क के रूप में "-" देता है। यदि विकल्प एक से अधिक तर्क के लिए अनुमति है, तो कुछ या सभी पैरामीटर तर्क के रूप में वापस आ जाएंगे।

package com.lifetouch.commons.cli; 

import java.util.Arrays; 
import org.apache.commons.cli.*; 

public class DoubleHyphen { 
    private static Options options = new Options(); 

    public static void main(String args[]) { 
    // One required option with an optional argument: 
    @SuppressWarnings("static-access") 
    OptionBuilder builder = OptionBuilder.isRequired(true). 
      withDescription("one optional arg"). 
      withArgName("optArg").hasOptionalArgs(1); 
    options.addOption(builder.create("opt")); 

    // Illustrate the issue: 
    doCliTest(new String[] { "-opt"}); 
    doCliTest(new String[] { "-opt", "optArg", "param"}); 
    doCliTest(new String[] { "-opt", "--", "param"}); 
    // What I want is for the double-dash to terminate option processing. 
    // Note that if "opt" used hasOptionalArgs(2) then "param" would be a second 
    // argument to that option (rather than an application parameter). 
    } 

    private static void doCliTest(String[] args) { 
    System.out.println("\nTEST CASE -- command line items: " + Arrays.toString(args)); 

    // Parse the command line: 
    CommandLine cmdline = null; 
    try { 
     CommandLineParser parser = new GnuParser(); 
     cmdline = parser.parse(options, args); // using stopAtNonOption does not help 
    } catch (ParseException ex) { 
     System.err.println("Command line parse error: " + ex); 
     return; 
    } 

    // Observe the results for the option and argument: 
    String optArgs[] = cmdline.getOptionValues("opt"); 
    if (null == optArgs) { 
     System.out.println("No args specified for opt"); 
    } else { 
     System.out.println(optArgs.length + " arg(s) for -opt option: " + 
       Arrays.toString(optArgs)); 
    } 

    // Observe the results for the command-line parameters: 
    String tmp = Arrays.toString(cmdline.getArgList().toArray()); 
    System.out.println(cmdline.getArgList().size() + 
      " command-line parameter(s): " + tmp); 
    } 
} 
+0

आप नवीनतम अपाचे कॉमन्स CLI ** 1.2 ** संस्करण का उपयोग कर रहे हैं? –

+0

हां, मैं 1.2 – MykennaC

+0

का उपयोग कर रहा हूं, फिर नीचे 'PosixParser' काम करना चाहिए। [PosixParser.java] देखें (http://javasourcecode.org/html/open-source/commons-cli/commons-cli-1.2/org/apache/commons/cli/PosixParser.java.html) स्रोत कोड: यह सौदा करता है '--' के साथ (देखें 'निजी शून्य प्रक्रिया नॉनऑप्शन टोकन (स्ट्रिंग वैल्यू, बूलियन स्टॉपएटोनऑप्शन)' लाइन 182 पर)। –

उत्तर

6

आदेश एक विकल्प टर्मिनेटर के रूप में विशेष टोकन -- संभाल करने में, आप POSIX पार्सर का उपयोग करना चाहिए:

यहाँ मुद्दा illustrating नमूना कोड है।

उपयोग

CommandLineParser parser = new PosixParser(); 

बजाय

CommandLineParser parser = new GnuParser(); 
+0

जैसा कि मेरी ओपी टिप्पणियों (ऊपर) में उल्लेख किया गया है, बस PosixParser पर स्विच करने से समस्या हल नहीं होती है। – MykennaC

+0

क्या आपने 'सत्य' और 'झूठी' 'stopAtNonOption' विकल्प 'के साथ खेलने की कोशिश की है?अगर इससे मदद नहीं मिलती है, तो अपाचे कॉमन्स सीएलआई [कमांड लाइन तर्कों के लिए POSIX सम्मेलन] (http://www.iam.ubc.ca/guides/javatut99/essential/attributes/_posix.html) के साथ अनुपालन नहीं करता है और मैं मैं एक बग रिपोर्ट में खुद को –

+0

हां दर्ज करूंगा। StopAtNonOption मान GnuParser या PosixParser के लिए कोई फर्क नहीं पड़ता। ऊपर मेरा टेस्ट प्रोग्राम आसानी से इसका प्रदर्शन कर सकता है। तीसरे टेस्ट केस के परिणामों को कभी न बदलें। बिंदु को मजबूत करने के लिए, "-opt - -opt2" के लिए एक परीक्षण केस जोड़ें। – MykennaC

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

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