怎么基于Java编写一个CLI工具?

CLICLI,全称为命令行界面(Command Line Interface),是一种用于通过键盘输入指令与操作系统进行交互的软件机制 。这种界面是在图形用户界面得到普及之前使用最为广泛的用户界面,并且, 即使在当前图形用户界面广泛使用的环境下,CLI仍然有其独特的优势和广泛的应用 。
对于CLI,它的一个重要特性就是效率 。用户可以在一条文本命令中对多个文件执行操作,而不需要在各个窗口之间切换,节省了大量时间 。此外 , 如果你已经熟悉了这些命令,那么你可以非常快速地浏览系统并与之交互 。
构建CLI的工具很多,今天主要基于JAVA语言来实现,其中Apache Commons CLI框架提供了这样的便利 。今天结合之前学习的graalVM提供的native-image工具,来生成一个exe类型的可执行文件,由于graalVM的跨平台性,我们还能生成各个平台的CLI命令来辅助完成更多的工作 。
Apache Commons CLI是一个用于编写命令行界面的Java库 。它提供了一个灵活的框架,可以很容易地定义和解析命令行参数 。这个库的主要优点是它可以处理各种类型的参数,包括选项、位置参数、可选参数等 。
构成下面以native-image为例,通过在终端输入native-image --help可以看到以下信息
_> native-image --helpGraalVM Native Image (https://www.graalvm.org/native-image/)This tool can ahead-of-time compile Java code to native executables.Usage: native-image [options] class [imagename] [options](to build an image for a class)ornative-image [options] -jar jarfile [imagename] [options](to build an image for a jar file)ornative-image [options] -m <module>[/<mAInclass>] [options]native-image [options] --module <module>[/<mainclass>] [options](to build an image for a module)where options include:@argument filesone or more argument files containing options-cp <class search path of directories and zip/jar files>-classpath <class search path of directories and zip/jar files>--class-path <class search path of directories and zip/jar files>A ; separated list of directories, JAR archives,and ZIP archives to search for class files.-p <module path>--module-path <module path>...A ; separated list of directories, each directoryis a directory of modules.一个合格的CLI基本都会提供help选项来展示,这个CLI的语法、选项以及功能描述 。从上面的输出可以看到help主要包括:

  1. 介绍:主要对命令的功能的描述,包括官网、版本以及一些内在系数等
  2. 用法:包括命令语法格式、配置项、参数等信息
  3. 参数说明:具体配置项参数的说明 , 以及具体的功能描述
Common-CLI
  • 定义阶段:在Java代码中定义Option参数,定义参数、是否需要输入值、简单的描述等
  • 解析阶段:应用程序传入参数后 , CLI进行解析
  • 询问阶段:通过查询CommandLine询问进入到哪个程序分支中
定义阶段主要是借助Option类提供的API来构建各种选项以及参数信息,下面是对应API的描述:
返回值
方法名
说明
Options
addOption(Option opt)
添加一个选项实例
Options
addOption(String opt, boolean hasArg, String description)
添加一个只包含短名称的选项
Options
addOption(String opt, String description)
添加一个只包含短名称的选项
Options
addOption(String opt, String longOpt, boolean hasArg, String description)
添加一个包含短名称和长名称的选项
Options
addOptionGroup(OptionGroup group)
添加一个选项组
List
getMatchingOptions(String opt)
获得匹配选项的长名称集合
Option
getOption(String opt)
通过长名称或短名称获得选项
OptionGroup
getOptionGroup(Option opt)
获得选项所在的选项组
Collection
getOptions()
获得一个只读的选项集合
List
getRequiredOptions()
获得必须的选项集合
boolean
hasLongOption(String opt)
判断是否存在选项
boolean
hasOption(String opt)
判断是否存在选项
boolean
hasShortOption(String opt)
判断是否存在选项
解析阶段主要对输入参数的解析,也就是main方法的参数,默认提供下面3中语法解析的支持:


推荐阅读