F L*_*has 3 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);
}
}
Run Code Online (Sandbox Code Playgroud)
在我看来,您可能可以使用 OptionGroup ,其描述为:
一组互斥的选项。
因此,您可以OptionGroup使用您的选项构建一个-h,也可以使用所有其他选项构建一个。然后添加两个OptionGroups。
一些研究建议使用多次解析尝试:
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);
}
Run Code Online (Sandbox Code Playgroud)