Apache Commons CLI 的使用

Commons CLI 简介

Apache Commons CLI 是 Apache 下面的一个解析命令行输入的工具包,该工具包还提供了自动生成输出帮助文档的功能。 Apache Commons CLI 支持多种输入参数格式,主要支持的格式有以下几种:

  • POSIX(Portable Operating System Interface of Unix)中的参数形式,例如 tar -zxvf xx.tar
  • GNU 中的长参数形式,例如 du –human-readable –max-depth=1
  • Java 命令中的参数形式,例如 java -Djava.net.useSystemProxies=true Foo
  • 短杠参数带参数值的参数形式,例如 gcc -O2 foo.c
  • 长杠参数不带参数值的形式,例如 ant - projecthelp

使用

通常情况下命令行处理有三个步骤:定义、解析和处理阶段。

官方的ant示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 tow

定义阶段

Apache Commons CLI使用Option表示每一个命令,使用Options封装多个Option。

定义 Options 代码片段

1
2
3
4
5
6
7
8
// 创建 Options 对象
Options options = new Options();
// 添加 -h 参数,后面不需要输入数值
options.addOption("h", false, "Print this usage information");
// 添加 -c 参数,需要输入数值
options.addOption("c", "configfile", true, "input configfile");
HelpFormatter f = new HelpFormatter();
f.printHelp("example h", options );

输入结果会是:

1
2
3
usage: example h
-c,--configfile <arg> input configfile
-h Print this usage information

其中 addOption() 三个参数的方法,第一个参数设定这个 option 的单字符名字,第二个参数指明这个 option 是否需要输入数值,第三个参数是对这个 option 的简要描述。
其中 addOption() 四个参数的方法,第一个和后两个与三个参数的方法含义一样。第二个参数是长参数名。

解析阶段

在解析阶段中,通过命令行传入应用程序的文本来进行处理。处理过程将根据在解析器的实现过程中定义的规则来进行。在 CommandLineParser 类中定义的 parse 方法将用 CLI 定义阶段中产生的 Options 实例和一组字符串作为输入,并返回解析后生成的 CommandLine。

解析 Options 代码片段:

1
2
3
4
5
6
7
String[] args =new String[]{"-h","-c","xx"};
CommandLineParser parser = new PosixParser();
CommandLine cmd = parser.parse(options, args);
if(cmd.hasOption("h")) {
// 这里显示简短的帮助信息
System.out.println("help");
}

处理阶段

在处理阶段中,应用程序通过查询 CommandLine,并通过其中的布尔参数和提供给应用程序的参数值来决定需要执行哪些程序分支。这个阶段在用户的代码中实现,CommandLine 中的访问方法为用户代码提供了 CLI 的询问能力。

CLI 处理阶段的目标结果就是将所有通过命令行以及处理参数过程中得到的文本信息传递给用户的代码。

1
2
3
4
5
6
7
8
9
10
11
// 获取 -c 参数值
String configfile= cmd.getOptionValue("c");
if(configfile == null)
{
// 做处理
}
else
{
// 另外的处理
System.out.println(configfile);
}

如果用户设置了 c 参数,getOptionValue() 方法将获取用户设定的数值,如果没有指定该参数,getOptionValue() 方法将返回 null,应用程序会根据返回的数值来决定代码的运行。

总结

通过Commons CLI 可能方便的写出按标准解析参数的程序。特别是当参数很多时。

参考

https://commons.apache.org/proper/commons-cli/usage.html
https://www.ibm.com/developerworks/cn/java/j-lo-commonscli/