该示例将通过第一个布尔类型的参数来控制示例输出日期(如:2022-10-01)或者日期时间(2022-10-01 12:00:00)。
在 Apache Commons CLI 中,一个布尔选项在命令行中通过是否存在这个选项来进行表示。如果选项中存在该选项,则选项值为 true。如果选项中不存在该选项,则该选项的值为 false。
Commons CLI 在创建命令行解析时,必须创建一个 Options 对象,并且必须将程序支持的所有选项添加到该 Options 对象中。简单来说,在解析命令行之前,我们需要事先约定该程序支持哪些选项。
创建 Options 如下:
// 创建 Options 对象 Options options = new Options(); // 添加 t 选项 options.addOption("t", false, "display current time");
说明:addOption() 方法有三个参数:
(1)第一个参数表示选项的字符串。
(2)第二个参数是一个布尔值,它指定该选项是否需要一个参数。在布尔选项(有时被称为标志)的情况下,参数值不会出现,因此会传递 false。
(3)第三个参数是选项的描述,该描述将在应用程序的使用帮助中显示。
前面介绍了选项定义,在 Commons CLI 中通过 CommandLineParser 类的 parse() 方法来解析命令行参数。CommandLineParser 接口有几个实现,分别为 BasicParser、 DefaultParser、GnuParser、Parser、PosixParser,推荐使用 DefaultParser 实现。
解析命令行参数如下:
// 创建一个解析器 CommandLineParser parser = new DefaultParser(); // options 为选项 // args 为命令行参数 CommandLine cmd = parser.parse( options, args);
成功解析命令行参数后,我们需要做的是检查 t 选项是否存在。要做到这一点,我们将查询 CommandLine 对象。CommandLine 的 hasOption() 方法接收字符串参数。如果字符串选项存在,返回 true。如果字符串不存在,否则它返回 false。例如:
// 检查选项 t 是否存在 if (cmd.hasOption("t")) { // 打印日期和时间 } else { // 打印日期 }
该示例默认输出当前日期,如果运行时携带了 -t 参数,则输出日期和时间。
代码如下:
package com.hxstrive.cli; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.CommandLineParser; import org.apache.commons.cli.DefaultParser; import org.apache.commons.cli.Option; import org.apache.commons.cli.Options; 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"); /** * 程序入口方法 * @param args 程序选项参数 * @throws Exception */ 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 2023-06-26
带 -t 参数运行程序,输出如下:
$ java Demo1 -t 2023-06-26 10:46:19