Commons CLI

时间:2017-08-13 00:43:16

标签: java apache-commons-cli

我正在尝试将Java中的命令行参数解析为以下用法:

Usage: gibl FILE
 -h,  --help      Displays this help message.
 -v,  --version   Displays the program version.
 FILE             Source file.

使用Apache Commons CLI库,我知道我可以使用Option来解析-h-v命令,然后使用CommandLine.getArgs()来获取剩下的参数FILE然后按我的意愿解析它,但我实际上想在CLI中将其指定为Option

目前,我执行以下操作:

if (cmd.getArgs().length < 1) {
    System.out.println("Missing argument: FILE");
    help(1); // Prints the help file and closes the program with an exit code of 1.
}
String file = cmd.getArgs()[0];

但是当我调用HelpFormatter.printHelp(String, Options)时,我的额外参数不会包含在自动生成的帮助文本中。

我所追求的是这样的:

Option file = new Option("Source file.");
file.setRequired(true);
options.addOption(file);

我有一个参数,但没有附加相应的选项标识符,因此可以将其传递给HelpFormatter。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

Apache Commons CLI 1.4:

您可以通过以下方式访问没有关联标志的命令行参数:

org.apache.commons.cli.CommandLine#getOptionValue("option-name")

它返回所有NOT消耗/解析参数的列表。

因此,您可以通过以下方式获取已定义的选项:

  • org.apache.commons.cli.CommandLine#hasOption("option-name")
  • org.apache.commons.cli.CommandLine#getArgList()
  • (...)

或通过上述说明获取所有未解析/未识别选项的列表:

{{1}}

答案 1 :(得分:2)

据我所知,Commons CLI不支持在没有关联标志的情况下定义选项。我想你需要做这些事情:

resolve(root, args) {
    return db.record.findOne({ where: { UID: args.UID } })
        .then(record => {
            let newArr = undefined
            if (record.watched == null) {
                newArr = [args.value]
            } else {
                let old = record.watched
                newArr = old.concat([args.value])
            }
            return db.record.update({ watched: newArr }, { where: { UID: args.UID } });
        });
}

如果您没有看到它,this question非常相似,我的答案与那里的答案非常相似。