Как заставить Apache CLI обрабатывать двойное тире?

Я просмотрел документацию, но не могу понять, как заставить Apache Commons CLI обрабатывать двойное тифло "option", которое обычно завершает обработку опций.

Рассмотрим следующую командную строку, в которой есть опция "-opt", которая может принимать дополнительный аргумент, который не указан:

MyProgram -opt -- param1 param2

Я хочу, чтобы в этом случае опция не содержала аргументов, но Apache возвращает "--" в качестве аргумента. Если бы опция допускала более одного аргумента, то некоторые или все параметры были бы возвращены в качестве аргументов.

Вот пример кода, иллюстрирующий проблему:

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);
  }
}
5
задан MykennaC 16 January 2012 в 17:25
поделиться