Apache Commons CLI库提供了一个API,用于解析传递给程序的命令行选项。它还可以打印帮助消息,详细说明命令行工具的可用选项。
Commons CLI 支持不同类型的选项:
类似于 POSIX 的选项,例如 tar -zxvf foo.tar.gz
GNU 喜欢长选项,例如 du --human-readable --max-depth=1
Java 类属性,例如 java -Djava.awt.headless=true -Djava.net.useSystemProxies=true Foo
带有附加值的短选项,例如 gcc -O2 foo.c
带有单个连字符的长选项,例如 ant -projecthelp
Commons CLI 显示的典型帮助消息如下所示:
usage: ls -A,--almost-all do not list implied . and .. -a,--all do not hide entries starting with . -B,--ignore-backups do not list implied entried ending with ~ -b,--escape print octal escapes for nongraphic characters --block-size <SIZE> use SIZE-byte blocks -c with -lt: sort by, and show, ctime (time of last modification of file status information) with -l:show ctime and sort by name otherwise: sort by ctime -C list entries by columns
命令行处理有三个阶段。这三个阶段分别是:
(1)定义阶段
(2)解析阶段
(3)询问阶段
以下各节将依次讨论这些阶段,并讨论如何使用 Commons CLI 去处理命令行选项。
每个命令行都必须定义一组选项,这些选项将用于定义应用程序的接口。
CLI 使用 Options 类作为 Option 实例的容器。在 CLI 中有两种创建选项的方法。其中一种是通过构造函数,另一种是通过选项中定义的工厂方法。
定义阶段的结果是一个 Options 实例。
解析阶段是处理通过命令行传递到应用程序的文本的阶段。根据解析器实现定义的规则处理文本。
在 CommandLineParser 上定义的 parse 方法接受一个 Options 实例和一个 String[] 参数并返回一个 CommandLine。
解析阶段的结果是一个 CommandLine 实例。
询问阶段是应用程序查询命令行以根据布尔选项决定采用哪个执行分支并使用选项值提供应用程序数据的阶段。
此阶段在用户代码中实现。CommandLine 上的访问器方法为用户代码提供了查询功能。
询问阶段的结果是,用户代码完全了解命令行上提供的所有文本,并根据解析器和选项规则进行处理。
运行示例代码默认输出当前日期,如果运行示例时指定了 -t 参数,则输出日期和时间。代码如下:
import org.apache.commons.cli.*; import java.text.SimpleDateFormat; import java.util.Date; /** * 默认输出当前日期,如果携带 -t 参数则同时输出时间 * @author Administrator */ public class Demo1 { private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); private static final SimpleDateFormat DATETIME_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public static void main(String[] args) throws Exception { // 定义程序选项 Options options = new Options(); options.addOption(new Option("t", false, "显示时间")); // 解析程序选项参数 CommandLineParser lineParser = new DefaultParser(); CommandLine commandLine = lineParser.parse(options, args); // 判断程序是否指定了 -t 选项参数 if(commandLine.hasOption("t")) { System.out.println(DATETIME_FORMAT.format(new Date())); } else { System.out.println(DATE_FORMAT.format(new Date())); } } }
如果执行“java Demo1”命令,输出如下:
2021-11-15
如果执行“java Demo1 -t”命令,输出如下:
2021-11-15 22:23:50