Commons CLI
Apache Commons CLI库提供了一个API,用于解析传递给程序的命令行选项。它还能够打印详细说明命令行工具可用选项的帮助消息。命令行处理分为三个阶段。它们是定义,解析和询问阶段。
各个阶段的详细介绍见官方文档
maven依赖
<!-- https://mvnrepository.com/artifact/commons-cli/commons-cli -->
<dependency>
<groupId>commons-cli</groupId>
<artifactId>commons-cli</artifactId>
<version>1.4</version>
</dependency>
定义阶段
CLI使用Options这个类来定义和设置参数,它是所有参数的容器。
Option
Options options = new Options();
Option option = new Option("t", "table", true, "table name");
options.addOption(option);
参数 | 含义 | 说明 |
---|---|---|
opt | 短名称参数 | |
longOpt | 长名称参数 | |
hasArg | 是否有参数值 | 当为false 后续获取值时返回null |
description | 描述 |
Option.builder
Option dbOption = Option.builder("d").argName("args")
.hasArg()
.longOpt("database")
.desc("database name")
.build();
options.addOption(dbOption);
解析阶段
CLI提供了接口CommandLineParser,并用不同的实现类来实现各种解析方式。BasicParser, GnuParser, PosixParser在since 1.3 不推荐使用了, 推荐直接使用DefaultParser。
类型 | 举例 | 描述 |
---|---|---|
POSIX | tar -zxvf foo.tar.gz | |
GNU中长参数形式 | du --human-readable --max-depth=1 | |
Java命令中的参数形式 | java -Djava.awt.headless=true Foo | |
短杠带参数值的形式 | curl -X POST www.baidu.com |
我们以官方demo为例:
ant [options] [target [target2 [target3] ...]]
Options:
-help print this message
-projecthelp print project help information
-version print the version information and exit
-quiet be extra quiet
-verbose be extra verbose
-debug print debugging information
-emacs produce logging information without adornments
-logfile <file> use given file for log
-logger <classname> the class which is to perform logging
-listener <classname> add an instance of class as a project listener
-buildfile <file> use given buildfile
-D<property>=<value> use value for given property
-find <file> search for buildfile towards the root of the
filesystem and use it
args = new String[]{ "-help", "-Djava.awt.headless=true", "-version", "-logfile", "/data/xdb.txt"};
// 定义
Options options = new Options();
// boolean类型的option
Option help = new Option("help", "print this message");
Option version = new Option("version", "print the version information and exit");
// 参数类型的option, OptionBuilder 不推荐使用
Option logfile = Option.builder("logfile").argName("file")
.hasArg()
.desc("use given file for log")
.build();
// k=v
Option properties = Option.builder("D").argName("property=value")
.hasArgs()
.valueSeparator()
.build();
options.addOption(help);
options.addOption(version);
options.addOption(logfile);
options.addOption(properties);
// 解析阶段
CommandLine cmdLine = new DefaultParser().parse(options, args);
Properties d = cmdLine.getOptionProperties("D");
d.keySet().forEach(key->{
System.out.println(key+":"+d.get(key));
});
if(cmdLine.hasOption("help")){
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp( "ant [options] [target [target2 [target3] ...]]", options );
}
if(cmdLine.hasOption("version")){
System.out.println("Version: 1.2.3");
}
String logfile1 = cmdLine.getOptionValue("logfile");
System.out.println("logfile:" + logfile1);
询问阶段
就是相当于查询命令的用法, 类似于 curl --help
HelpFormatter hf = new HelpFormatter();
hf.setWidth(110);
hf.printHelp("testApp", options, true);