通常命令行处理有三个阶段,分别为定义阶段、解析阶段和执行阶段。下面将依次讨论这些阶段,并讨论如何使用 Apache Commons CLI 去实现它们。
每个命令行必须定义一组选项,这些选项将用于定义应用程序的接口。
Apache Commons CLI 使用 Options 类作为选项(Option)实例的容器。在 Apache Commons CLI 中创建 Options 有两种方法,分别如下:
(1)通过构造函数
(2)通过在 Option 中定义的工厂方法
示例:
import org.apache.commons.cli.Options; import org.apache.commons.cli.Option; ... // 定义程序选项 Options options = new Options(); options.addOption(new Option("t", false, "显示时间"));
解析阶段是通过命令行将文本传递到应用程序,文本将按照解析器实现定义的规则进行处理。
Apache Commons CLI 中,在 CommandLineParser 上定义的 parse() 方法接受一个 Options 实例和一个 String[] 参数,并返回一个 CommandLine 对象。
示例:
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; ... // 定义程序选项 Options options = new Options(); options.addOption(new Option("t", false, "显示时间")); // 解析程序选项参数 CommandLineParser lineParser = new DefaultParser(); CommandLine commandLine = lineParser.parse(options, args);
执行阶段是应用程序查询 CommandLine 来决定根据布尔选项选择哪个执行分支,并使用选项值来提供应用程序数据。
这个阶段是在用户代码中实现的。CommandLine 上的访问器方法为用户代码提供了查询功能(确定用户是否提供了某个选项)。
该阶段的执行结果是用户代码完全了解了在命令行上提供的所有文本,并根据解析器和选项规则进行处理。
示例:
import org.apache.commons.cli.CommandLine; ... 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())); }
该示例默认输出当前日期,如果运行时携带了 -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