Apache Commons CLI 1.3.1:具有多个参数的另一个选项之后的选项将作为ARGUMENT使用

时间:2016-01-16 01:32:51

标签: java apache-commons apache-commons-cli

我使用Apache Commons CLI 1.3.1处理一些选项,一些选项可以使用一个到无限数量的参数。有两个选项的琐事示例就像这样

usage: myProgram -optionX <arg1> <arg2> <arg3> < ... > [-optionY]
-optionX <arg1> <arg2> <arg3> < ... >   optionX takes one to unlimited
                                        number of arguments.
-optionY                                optionY is optional

我发现第二个选项optionY始终被识别为optionX ARGUMENT ,而不是被识别为 OPTION 通过它自己。这意味着如果你输入 在命令行中myProgram -optionX arg1 arg2 -optionY,您将获得与arg1相关联的三个参数(arg2-optionYoptionX)。

以下是任何人都可以用来重现问题的代码。

import org.apache.commons.cli.*;

public class TestCli {

public static void main(String[] args) {

    Option optObj1 = Option.builder("optionX")
                            .argName("arg1> <arg2> <arg3> < ... ")
                            .desc("optionX takes one to unlimited number of arguments.")
                            .required()
                            .hasArgs()
                            .build();

    Option optObj2 = new Option("optionY", "optionY is optional");

    Options optsList = new Options();
    optsList.addOption(optObj1);
    optsList.addOption(optObj2);

    CommandLineParser commandLineParser = new DefaultParser();

    try {

        CommandLine cmd = commandLineParser.parse(optsList, new String[]{"-optionX", "arg1", "arg2", "-optionY"});

        System.out.println("--------------------------");
        System.out.println("argument list of optionX: ");
        for (String argName : cmd.getOptionValues(optObj1.getOpt())) {
            System.out.println("arg: " + argName);
        }

        System.out.println("--------------------------");
        System.out.println("value of optionY: " + cmd.hasOption(optObj2.getOpt()));

    } catch (ParseException e) {
        System.out.println("Unexcepted option: " + e.getMessage());
    }

}
}

这是您将看到的输出。

--------------------------
argument list of optionX: 
arg: arg1
arg: arg2
arg: -optionY
--------------------------
value of optionY: false

我在这里想念一下吗?

任何建议都会非常感激。

1 个答案:

答案 0 :(得分:3)

问题是您将长名称放在选项的短名称中。

当您使用Option optObj1 = Option.builder("optionX")....new Option("optionY", "optionY is optional")时,您需要设置该选项的短名称,该名称应该只有1个字符长。

在你有一个多参数选项之前,这很有效。在这种情况下,解析器找不到&#34; o&#34; (选项的第一个字母)在他的短选项列表中,你没有设置长名称,因此解析器确定-optionY只是-optionX的另一个参数。

要解决您的问题,只需设置选项的长选项名称即可。

示例

Option.builder("x").longOpt("optionX")....

Option optObj2 = new Option("y", "optionY", hasArgs, "optionY is optional");