Java Commons-CLI 命令行参数解析

随着科学计算可视化及多媒体技术的飞速发展,人机交互技术不断更新,但是最传统的命令行模式依然被广泛的应用于多个领域,因为命令行界面要较图形用户界面节约更多的计算机系统资源。在熟记命令的前提下,使用命令行界面往往要较使用图形用户界面的操作速度要快。同时,命令行模式也更加有利于客户进行二次开发,方便应用程序的整合。Apache Commons CLI 提供了很多实用的工具和类实现,进一步方便了我们对命令行工具的开发。

Commons-CLI 介绍

Apache Commons 是 Apache 软件基金会的项目,曾隶属于 Jakarta 项目。Commons 的目的是提供可重用的、开源的 Java 代码。Commons 由三部分组成:Proper(是一些已发布的项目)、Sandbox(是一些正在开发的项目)和 Dormant(是一些刚启动或者已经停止维护的项目)。

这里介绍的 Commons-CLI 就是其中一个开源项目,可能是 Java 很少被拿来当命令行工具使用,大部分情况下,都是使用 Shell、Python 脚本来完成的,导致 Java 的命令行参数解析库比较少,按道理来说,Java SE 应该自带了相关的命令行参数解析 API,然而并没有(Shell 可以使用自带的 getopts,Python 则有更好用的 argparse)。

然而,除了 Shell,Python 我基本都忘光了,现在也没有精力去捡起来了,只能靠 Java 才能维持得了生活这样子(但实际上,我 Java 也是刚入门不久,但是愈发觉得这是一门很有风格的编程语言,写起来特别舒服,虽然有时候觉得又臭又长)。一般的需求 Shell 都还能应付,但是如果想进行网络编程,就不行了,只能借助 Java 了(其实本来想用 C/C++ 的,然而也是忘得差不多了,写起来也没有 Java 舒服),于是就 Google 找到了几个命令行参数解析库。

  • Commons-CLI:API 中的类很少,使用也很简单,对我来说够用了。
  • argparse4j:Python 中著名的 argparse 库的 Java 移植版,好是好,就是感觉有点小复杂。

我大概看了一下 argparse4j 的文档,发现配置项太多了,虽然功能很多也很强大,但是却有点令人望而生畏。懒癌发作的我机智的选择了明显更易使用和理解的 Commons-CLI 开源解析库。

Commons-CLI 安装

Commons-CLI v1.4 版本下载,解压后的文件列表:

我们只需要其中的两个 jar 文件:
commons-cli-1.4.jar:类文件,将它加入到 CLASSPATH 后就能使用了。
commons-cli-1.4-javadoc.jar:API 文档(JavaDoc),用浏览器访问。

Commons-CLI 使用

Commons-CLI 中的类位于 org.apache.commons.cli 包,相关的类有:

  • CommandLineParser:接口,命令行参数解析器,根据 Options、String[] 解析出 CommandLine 结果对象。
  • DefaultParser:CommandLineParser 的实现类,CLI v1.3 版本后,这是唯一的命令行参数解析器实现类。
  • CommandLine:由 CommandLineParser 解析产生的结果对象,我们需要从该对象中获取当前的命令行参数。
  • HelpFormatter:命令行帮助信息格式化工具,使用其 printHelp() 方法可以打印出格式良好的帮助信息。
  • Option:代表一个命令行选项,是一个命令行选项的抽象表示,如选项名称,长名称,是否需要选项参数。
  • Option.Builder:Option 类的构建器,静态内部类,推荐使用构建器构建 Option 对象,而非构造函数。
  • Options:存储 Option 对象的容器,表示一组选项,是 CommandLineParser 解析器所需参数之一。
  • ParseException:发生任何解析异常时,此异常被抛出,它是下面几个异常类的基类。
  • MissingOptionException:如果某个必需的选项未提供,则此异常被抛出。
  • MissingArgumentException:如果某个选项缺少参数,则此异常被抛出。
  • UnrecognizedOptionException:如果遇到未知选项,则此异常被抛出。

命令行参数解析分为 3 个阶段,分别是 定义解析询问 阶段。

定义阶段
为当前命令定义对应的命令行选项,CLI 使用 Options 类作为 Option 的容器。定义阶段的结果是一个 Options 实例。

解析阶段
参数解析器的 parse() 方法需要一个 Options 对象和一个 String[] 对象。解析阶段的结果是一个 CommandLine 实例。

询问阶段
应用程序通过 CommandLine 对象的相关查询方法,获取当前的命令行选项,如是否设置了某选项,某选项的参数等。

先通过一个简单的例子,感性的认识一下整个命令行参数解析的流程:
程序很简单,就是用来产生随机字符串的,-l 参数指定随机级别,-n 参数指定长度。

CommandLineParser 接口

CommandLine

HelpFormatter

Options

Option