Java 带Apache commons CLI的条件命令行选项

Java 带Apache commons CLI的条件命令行选项,java,apache-commons-cli,Java,Apache Commons Cli,我目前正在使用Apache的公共CLI库来解析命令行选项,我想知道是否有一种简单的方法可以满足条件需求 例如,在下面的示例中,我有两个必需的选项-a和-b,以及一个可选的-h,应该会显示一些说明。解析器现在的工作方式是,只要缺少一个必需的选项,它就会抛出ParserException。到现在为止,一直都还不错。我的问题是,如果指定了-h,是否有办法不查找所需的选项。由于-h通常只打印帮助而不实际启动我的应用程序,因此我想跳过检查其他命令行选项 import org.apache.commons.

我目前正在使用Apache的公共CLI库来解析命令行选项,我想知道是否有一种简单的方法可以满足条件需求

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

import org.apache.commons.cli.*;
公共类MyClass{
...
公共静态void main(字符串[]参数)
{
选项=新选项();
Option opt_a=Option.builder(“a”)
.argName(“A选项”)
。必需(正确)
.longOpt(“a选项”)
.desc(“第一选项”)
.build();
Option opt_b=Option.builder(“b”)
.argName(“B选项”)
。必需(正确)
.longOpt(“b选项”)
.desc(“第二选项”)
.build();
Option opt_h=Option.builder(“h”)
.argName(“帮助”)
.longOpt(“帮助”)
.desc(“显示此帮助”)
.build();
选项。添加选项(选项a);
选项。添加选项(选项b);
选项。添加选项(opt_h);
CommandLineParser parser=新的DefaultParser();
试一试{
CommandLine cmd=parser.parse(选项、参数);
...
}捕获(解析异常){
System.err.println(“错误解析命令行选项”);
System.err.println(e.getMessage());
使用(选项);
系统出口(1);
}
}
公共静态无效用法(选项){
String header=“我的应用程序\n\n”;
String footer=“\n请在以下位置报告问题:http://github.com/user/repo/issues";
HelpFormatter formatter=新的HelpFormatter();
printHelp(“MyApp”、页眉、选项、页脚、true);
}
}

在我看来,您可能会使用以下描述的:

一组相互排斥的选项

因此,您将使用
-h
构建一个
选项组
,并使用所有其他选项构建一个。然后添加两个
OptionGroup
s


补充 一些人建议使用多个解析尝试:

        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
应该用来做的。@FLekschas-在这种情况下你需要多次解析。请看我对我的问题的评论;)我在这里找到了问题的答案:所以我的问题是重复的。