共享资源 CLI 所需组

我正在用Java编写命令行应用程序,我选择了Apache Commons CLI来解析输入参数。

假设我有两个必需的选项(即-输入和-输出)。我创建新的选项对象并设置所需的标志。现在一切都很好。但我有第三个,不是必需的选项,即。-帮助。使用我提到的设置,当用户想要显示帮助(使用-help选项)时,它说“-输入和-输出”是必需的。有没有办法实现这一点(通过Commons CLI API,如果(!hasOption)抛出新的XXXException()就不简单了)。


答案 1

在这种情况下,您必须定义两组选项并解析命令行两次。第一组选项包含位于所需组(通常为 和 )之前的选项,第二组包含所有选项。--help--version

首先解析第一组选项,如果未找到匹配项,则继续解析第二组。

下面是一个示例:

Options options1 = new Options();
options1.add(OptionsBuilder.withLongOpt("help").create("h"));
options1.add(OptionsBuilder.withLongOpt("version").create());

// this parses the command line but doesn't throw an exception on unknown options
CommandLine cl = new DefaultParser().parse(options1, args, true);

if (!cl.getOptions().isEmpty()) {

    // print the help or the version there.

} else {
    OptionGroup group = new OptionGroup();
    group.add(OptionsBuilder.withLongOpt("input").hasArg().create("i"));
    group.add(OptionsBuilder.withLongOpt("output").hasArg().create("o"));
    group.setRequired(true);

    Options options2 = new Options();
    options2.addOptionGroup(group);

    // add more options there.

    try {
        cl = new DefaultParser().parse(options2, args);

        // do something useful here.

    } catch (ParseException e) {
        // print a meaningful error message here.
    }
}

答案 2

commons-cli 库有一个流畅的包装器:https://github.com/bogdanovmn/java-cmdline-app

帮助选项是内置的。此外,还有一些方便的功能。例如,如果必须指定以下两个选项之一:

new CmdLineAppBuilder(args)
// Optional argument
.withArg("input", "input description")
.withArg("output", "output description")

// "input" or "output" must be specified
.withAtLeastOneRequiredOption("input", "output")

.withEntryPoint(
    cmdLine -> {
        ...
    }
).build().run();