Apache commons CLI的条件命令行选项

时间:2015-07-13 14:29:10

标签: java apache-commons-cli

我目前正在使用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);
    }
}

1 个答案:

答案 0 :(得分:2)

在我看来,您可能会使用OptionGroup,其描述为:

  

一组互斥的选项。

因此,您将使用OptionGroup构建一个-h,并使用所有其他选项构建一个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); } s。

有些research建议使用多个解析尝试:

self.parse_location(response)