使用Apache Commons CLI实现带条件的命令行选项

3

我目前正在使用Apache的常用CLI库来解析命令行选项,我想知道是否有一种简单的方法实现条件要求。

例如,在下面的示例中,我有两个必需的选项-a-b以及一个可选的-h,它应该显示一些描述。当前解析器的工作方式是如果缺少其中一个必需选项,则会抛出ParserException异常。到目前为止都很好。我的问题是,如果指定了-h,是否有一种方法不查找必需选项。由于通常-h只需要打印帮助信息而不实际启动我的应用程序,因此我想跳过检查其他命令行选项。

import org.apache.commons.cli.*;

public class MyClass {

    ...

    public static void main(String[] parameters)
    {
        Options options = new Options();

        Option opt_a = Option.builder("a")
                .argName("A Option")
                .required(true)
                .longOpt("a-option")
                .desc("First option")
                .build();

        Option opt_b = Option.builder("b")
                .argName("B Option")
                .required(true)
                .longOpt("b-option")
                .desc("Second option")
                .build();

        Option opt_h = Option.builder("h")
                .argName("Help")
                .longOpt("help")
                .desc("Shows this help")
                .build();

        options.addOption(opt_a);
        options.addOption(opt_b);
        options.addOption(opt_h);

        CommandLineParser parser = new DefaultParser();

        try {
            CommandLine cmd = parser.parse(options, args);
            ...
        } catch (ParseException e) {
            System.err.println("Error parsing command line options");
            System.err.println(e.getMessage());
            usage(options);
            System.exit(1);
        }
    }

    public static void usage(Options options) {
        String header = "My application\n\n";
        String footer = "\nPlease report issues at http://github.com/user/repo/issues";

        HelpFormatter formatter = new HelpFormatter();
        formatter.printHelp("MyApp", header, options, footer, true);
    }
}

我在这里找到了解决问题的答案:https://dev59.com/a2gv5IYBdhLWcg3wKtvj 所以我的问题是重复的。 - F Lekschas
1个回答

5

看起来你可能需要使用一个OptionGroup,它被描述为:

一组互斥的选项。

因此,你可以使用一个OptionGroup来构建你的-h,并使用另一个包含所有其他选项的OptionGroup。然后将这两个OptionGroup都添加进去。


添加

一些研究表明可以使用多个解析尝试:

        Options mainOptions = new Options();

        Option opt_a = Option.builder("a")
                .argName("A Option")
                .required(true)
                .longOpt("a-option")
                .desc("First option")
                .build();

        Option opt_b = Option.builder("b")
                .argName("B Option")
                .required(true)
                .longOpt("b-option")
                .desc("Second option")
                .build();
        mainOptions.addOption(opt_a);
        mainOptions.addOption(opt_b);

        Options helpOptions = new Options();
        Option opt_h = Option.builder("h")
                .argName("Help")
                .longOpt("help")
                .desc("Shows this help")
                .build();
        helpOptions.addOption(opt_h);
        CommandLineParser parser = new DefaultParser();
        try {
            CommandLine cmds = parser.parse(helpOptions, args, true);
            // have they specified a help option?
            if (cmds.getOptions().length == 0) {
                // No! Try normal options.
                cmds = parser.parse(mainOptions, args);
            } else {
                // They specified a help option.
            }
            //...
        } catch (ParseException e) {
            System.err.println("Error parsing command line options");
            System.err.println(e.getMessage());
            System.exit(1);
        }

很不幸,一个组内的所有选项都是相互独立的,但我更希望有两个相互独立的选项组。我不确定这是否应该使用OptionGroup来实现。 - F Lekschas
@FLekschas - 从这看起来,你需要在那种情况下进行多次解析。 - OldCurmudgeon
看看我对我的问题的评论 ;) - F Lekschas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接