简单的说,就是对命令的参数进行定义和解析的工具 -- 这里说的参数是我们常用的说法,而CLI里则是Option、Options,参数值(如果有)则是Option的arg(s)。

## 为什么

那么,为什么要用这个工具呢?

因为在很多情况下,一个命令要包含很多参数及值,而有时候我们又需要生成这样的参数,或者获解析这样的参数。

如果使用字符串的切割或者正则来做,当然也不是不行,就是麻烦,特别是在参数顺序不定,参数值个数不定,参数和参数值的分隔符不定的时候,无疑是很令人头疼的一件事。

这个时候,就是轮到CLI出马了。

## 概念

CLI这个库很简单,1.3.1版本 只有22个Java文件,其中5个还是@Deprecated 。

需要掌握的概念 Options、Option、CommandLineParser、CommandLine、HelpFormatter。

以shell命令 “ls -l -a -w=5” 为例:



CLI概念 对应
CommandLine “-l -a -w=5”
Option “-l”或”-a”或”-w”或”-S”或其他
Options “-l”、”-a”、”-w”、”-S”等所有Option的集合

需要注意:

CommandLine 不包含 ”ls” 本身。

Option 有的是必选项,有的是可选项。

Option 有的是带有值的,如”-w”,其值在Option中叫arg,而arg又有可选/必需之分,一些参数还有个数的限制。

OK,基本概念就这么简单,进入代码阶段。

## Option

Option的创建有两种方式,使用构造器,或者使用Option.builder。

构造器方式如下:

// 最简单的构造:参数名、参数说明
Option option1 = new Option("-l", "长格式名字"); // 参数名、参数是否有值、参数说明
Option option2 = new Option("-a", false, "显示全部文件、文件夹"); // 参数名、长参数名、参数是否有值、参数说明
Option option3 = new Option("-C", "--color", true, "什么时候彩色输出,候选值always、never、auto");

Option.builder 方式如下:

Option optionColor = Option.builder("-C") //注意,不要漏掉"-"
.longOpt("--color") // 完整写法
.argName("颜色")
.desc("彩色输出设置")
.required(false) //该选项是否必需?
.hasArg(true) //该选项是否需要一个参数?因为有的选项不需要参数
.valueSeparator('=') //选项与参数连接的符号 -C=never
.numberOfArgs(1) //该选项最多能接收的参数
.optionalArg(false) //该选项的参数是否可选? 注意与required的区别
.type(String.class) //该选项的值的类型?
.build();

可以看出,builder方式更全面一些,当然,最终生成的Option对象都是可以再逐项修改的。

## Options

有了各个Option,就可以将其添加到Options中了。

Options options = new Options();
options.addOption(option); //将所有相关的Option都添加到Options中。

## CommandLineParser

有了Options,我们就有了限制条件,就可以对实际的参数进行解析了。

String[] args = {"-l", "-C=auto", "-w=5"}; //模拟。通常是获取到的,所以才需要解析。
CommandLine commandLine = commandLineParser.parse(options, args);

## CommandLine

拿到了CommandLine,我们就可以获取需要的参数及值了!

// 可以获取到指定参数的值
System.out.println(commandLine.getOptionValue("-a"));
System.out.println(commandLine.getOptionValue("-C"));
System.out.println(commandLine.getOptionValue("-w")); // 还可以判断是否存在某个参数,等等,略。

OK,至此 其实已经撸完了必需的功能,着急的话就已经可以开工了。

但是,CLI 还提供了两个小东西,很有意思的小东西:PatternOptionBuilder、HelpFormatter。

## PatternOptionBuilder

这是一个快速构建Options的工具类,约定了一些符号的用法,如”:”、”/”、”!”等。

Overview of PatternOptionBuilder patterns
a -a flag
b@ -b [classname]
c> -c [filename]
d+ -d [classname] (creates object via empty constructor)
e% -e [number] (creates Double/Long instance depending on existing of a '.')
f/ -f [url]
g: -g [string]

注意,上面的字母都是参数项,这里只能使用单个字母。

看例子吧:

// 快速构建一个Options,有三个参数 "-v"、"-p"、"-f",其中"-p"需要有参数值,且类型是字符串;"-f"不是必选项,其参数值为URL
Options options = PatternOptionBuilder.parsePattern("vp:!f/"); // 参数,其实获取到的参数都是line.split("\\s+"),就是字符串数组
String[] args = {"-v", "-p", "whereru", "-f", "http://www.baidu.com"}; CommandLine commandLine = commandLineParser.parse(options, args); System.out.println(commandLine.getOptionValue("v"));
System.out.println(commandLine.getOptionValue("p"));
System.out.println(commandLine.getOptionValue("f"));

怎么样,够简单吧

## HelpFormatter

这个工具类,顾名思义,就是格式化帮助信息用的。

不多说,运行下一下下面的代码就明白了:

// 输出命令的帮助信息(类似于shell中的 cmd --help的结果)
@Test
public void help(){
HelpFormatter helpFormatter = new HelpFormatter(); // 注意,下面这些setter都可以忽略
helpFormatter.setSyntaxPrefix(">>>");
helpFormatter.setArgName("参数的名字");
helpFormatter.setLeftPadding(4);
helpFormatter.setDescPadding(4);
helpFormatter.setOptPrefix("-");
helpFormatter.setLongOptPrefix("--");
helpFormatter.setNewLine("\r\n-------------------\r\n-------------------\r\n");
helpFormatter.setLongOptSeparator("==");
helpFormatter.setWidth(18); // 这里这里这里
helpFormatter.printHelp("python", PatternOptionBuilder.parsePattern("vp:!f/"));
}

呼,希望有所帮助。

Apache Commons CLI的更多相关文章

  1. Apache Commons CLI官方文档翻译 —— 快速构建命令行启动模式

    昨天通过几个小程序以及Hangout源码学习了CLI的基本使用,今天就来尝试翻译一下CLI的官方使用手册. 下面将会通过几个部分简单的介绍CLI在应用中的使用场景. 昨天已经联系过几个基本的命令行参数 ...

  2. Apache Commons CLI命令行启动

    今天又看了下Hangout的源码,一般来说一个开源项目有好几种启动方式--比如可以从命令行启动,也可以从web端启动.今天就看看如何设计命令行启动... Apache Commons CLI Apac ...

  3. Apache Commons CLI 简介

    CLI 命令代码实现 命令行程序处理流程相对比较简单,主要流程为设定命令行参数 -> 解析输入参数 -> 使用输入的数据进行逻辑处理CLI 定义阶段 每一条命令行都必须定义一组参数,它们被 ...

  4. Apache Commons CLI 开发命令行工具示例

    概念说明Apache Commons CLI 简介 虽然各种人机交互技术飞速发展,但最传统的命令行模式依然被广泛应用于各个领域:从编译代码到系统管理,命令行因其简洁高效而备受宠爱.各种工具和系统都 提 ...

  5. The type org.apache.commons.cli.Options cannot be resolved. It is indirectly referenced from required .class files

    在搭建好Hadoop Eclipse开发环境后,编写map-reduce,遇到如下的问题: 从字面上可以看出,工程缺少org.apache.commons.cli.Options,这个包被间接的被其他 ...

  6. 使用 Apache Commons CLI 开发命令行工具示例

    Apache Commons CLI 简介 Apache Commons CLI 是 Apache 下面的一个解析命令行输入的工具包,该工具包还提供了自动生成输出帮助文档的功能. Apache Com ...

  7. 使用 Apache Commons CLI 解析命令行参数示例

    很好的输入参数解析方法 ,转载记录下 转载在: https://www.cnblogs.com/onmyway20xx/p/7346709.html Apache Commons CLI 简介 Apa ...

  8. JAVA 命令行参数解析,org.apache.commons.cli的使用

    maven依赖引入 <dependency> <groupId>commons-cli</groupId> <artifactId>commons-cl ...

  9. 使用commons.cli实现MyCP

    目录 Commons.cli库 MyCP 测试代码 总结 Commons.cli库 考虑到这次的任务是实现自己的命令行命令cp,我认为简单地使用args[]无法很好的完成需求.经过网上的一番搜索,我找 ...

随机推荐

  1. /etc/sudoers 配置

    /etc/sudoers ## Allow root to run any commands anywhere root ALL=(ALL) ALL #第一个root是用户账号 第二列的ALL是登陆者 ...

  2. HTML5学习笔记(九):选择器详解

    在前面的笔记中我们已经接触过几种常见的选择器,本笔记我们将深入了解CSS的选择器. 元素选择器 最常见的 CSS 选择器是元素选择器.换句话说,文档的元素就是最基本的选择器.在 W3C 标准中,元素选 ...

  3. 2-7-集合运算(A-B)∪(B-A)-线性表-第2章-《数据结构》课本源码-严蔚敏吴伟民版

    课本源码部分 第2章  线性表 - 集合运算(A-B)∪(B-A) ——<数据结构>-严蔚敏.吴伟民版        ★有疑问先阅读★ 源码使用说明  链接☛☛☛ <数据结构-C语言 ...

  4. 【小白的CFD之旅】22 好网格与坏网格

    网格疏密网格形状其他的一些问题小白的总结郑重申明 网格的作用如此重要,以至于小白纠结了很久.小白知道网格划分过程很大程度上受制于计算资源的限制,但小白还是不太明白,如果计算资源非常充足,不用顾忌资源限 ...

  5. kafka多线程消费及处理和手动提交处理方案设计[转]

    转自:http://blog.csdn.net/haoyifen/article/details/54692503 kafka与其他消息队列不同的是, kafka的消费者状态由外部( 消费者本身或者类 ...

  6. visual studio 2005提示脚本错误 /VC/VCWizards/2052/Common.js

    今天在做OCX添加接口的时候,莫名其妙的遇到visual studio 2005提示脚本错误,/VC/VCWizards/2052/Common.js. 网上找了很多资料,多数介绍修改注册表“vs20 ...

  7. js 将数字转换成人民币大写的方法

    //将数字转换成人民币大写的方法 var digitUppercase = function (n) { var fraction = ['角', '分']; var digit = [ '零', ' ...

  8. jetty 6.1 笔记

    download: http://dist.codehaus.org/jetty/jetty-6.1.22/ jetty 6.2 代码启动 必要jar包 lib --->> lib---& ...

  9. 详解利用Dockerfile构建mysql镜像并实现数据的初始化及权限设置

    本文提要 本文目的不仅仅是创建一个MySQL的镜像,而是在其基础上再实现启动过程中自动导入数据及数据库用户的权限设置,并且在新创建出来的容器里自动启动MySQL服务接受外部连接,主要是通过Docker ...

  10. Fiddler工具非常强大好用

    传递一个json对象发post请求案例: 1.打开Fiddler,点击Composer选项卡 2.下拉框选择Post 3.输入请求的URL,比如:http://localhost:49194/api/ ...