公共cli复杂的参数列表

Sta*_*art 2 java command-line-interface apache-commons-cli

我正在尝试构建一个复杂的参数列表,而不使用commons-cli项目链接多个解析器...

基本上我试图理解参数和可选参数是如何协同工作的......

示例命令帮助

$ admin <endpoint> <update> <name> [<type>] [<endpoint>] [<descriptions>]

//sample option creation for a    
options.addOption(OptionBuilder.hasArgs(3).hasOptionalArgs(2)
                .withArgName("name> <type> <uri> [<description>] [<endpoint>]")
                .withValueSeparator(' ')
                .create("add"));

CommandLine line = parser.parse(options, args, true);
Run Code Online (Sandbox Code Playgroud)

CommandLine不区分必需参数和可选参数...如何在不必为可选选项链接第二个解析器的情况下检索它们?

Joe*_*nte 5

我不确定Commons CLI是否可以使用未命名的,与位置相关的参数,它们似乎就是您正在寻找的.我写这个的方式是:

Option endpoint    = OptionBuilder.hasArgs(2)   .isRequired(true) .create("endpoint");
Option update      = OptionBuilder.hasArg(false).isRequired(false).create("update");
Option name        = OptionBuilder.hasArg(true) .isRequired(true) .create("name");
Option type        = OptionBuilder.hasArg(true) .isRequired(false).create("type");
Option description = OptionBuilder.hasArg(true) .isRequired(false).create("description");
Run Code Online (Sandbox Code Playgroud)

我不是100%肯定,如果第一个,endpoint将需要两个参数或只需要一个,但可以接受最多两个; 完全使用两个不同的论点可能会更清楚.

这将导致帮助热线看起来像:

usage: admin
-endpoint <point> [<point>]
-update
-name <name>
[-type <type>]
[-description <description>]
Run Code Online (Sandbox Code Playgroud)

我通常使用常量作为字符串名称:

public static final String ENDPOINT = "endpoint";
...
Option endpoint = OptionBuilder.hasArg().create(ENDPOINT);
Run Code Online (Sandbox Code Playgroud)

这样你以后可以参考它:

CommandLine opts = parser.parse(myopts, argv);
String endpoint = opts.getOptionValue(ENDPOINT);
Run Code Online (Sandbox Code Playgroud)

希望有所帮助!

  • 请注意,从“ CLI v1.3”开始,“ OptionBuilder”类已被弃用。请改用静态方法`Option.builder()`(请参阅http://stackoverflow.com/questions/35050704/apache-commons-cli-replacement-for-deprecated-optionbuilder)。 (2认同)