超强命令行解析工具Apache Commons CLI
概述
为什么要写这篇文章呢?因为在读flink cdc3.0源码的时候发现了这个工具包,感觉很牛,之前写过shell命令,shell是用getopts来处理命令行参数的,但是其实写起来很麻烦,长时间不写已经完全忘记了,现在才发现原来java也有这种工具类,所以先学习一下这个的使用,也许之后自己在写一些小工具的时候就可以用到呢,在此也分享给大家.
简介
定义 : Apache Commons CLI 是一个java类库.( ps : 什么是定义,定义就是对某类事物的具象化,添加限定词,比如人是什么什么的动物,这里CLI应该再加上多个限定词,因为java类库的范围太大,传达给别人的信息就是不明确的 )
重新定义一下(以上纯抽风) : Apache Commons CLI 是一个可以非常方便解析入参的,并且可以打印帮助信息的一个Java类 API库.
支持的选项类型 :
- POSIX 选项, 例如
tar -zxvf foo.tar.gz - GNU 长选项, 例如
du --human-readable --max-depth=1 - Java 选项, 例如
java -Djava.awt.headless=true -Djava.net.useSystemProxies=true Foo - 带有值的短选项, 例如
gcc -O2 foo.c - 带有单个连字符的长选项, 例如
ant -projecthelp
命令行处理三阶段
命令行的处理分为三个阶段,定义阶段,解析阶段,处理阶段
注意 : 以下代码的版本为1.6.0,maven依赖如下
<dependency><groupId>commons-cli</groupId><artifactId>commons-cli</artifactId><version>1.6.0</version></dependency>
1.定义阶段
创建命令行可以接收的选项,通过Options类来实现,它是Option的的容器.
// 定义阶段
Options options = new Options();Option filePathOption = new Option("f", true, "文件路径");
filePathOption.setRequired(true); // 文件路径为必传选项
Option daemonRunOption = new Option("d", false, "后台执行");
Option helpOption = new Option("h", "help", false, "帮忙文档");options.addOption(filePathOption);
options.addOption(daemonRunOption);
options.addOption(helpOption);
参数说明 :
Option 的全参构造如下
Option(String option, boolean hasArg, String description)
Option(String option, String description)
Option(String option, String longOption, boolean hasArg, String description)
option : 短选项 例如 f 注意这里不要加-,命令会自动解析-后为短选项
longOption : 长选项 例如 file 注意这里不要加–,解析中–后会自动解析为长选项
hasArg : 是否需要参数值
description : 描述
Option的属性说明 :
private final String option; // 短选项名称
private String longOption; // 长选项名称
private String argName; // 介绍较长,在下面
// 这个一般会在帮助信息中提示用户参数的相关信息,
// 例如在上面的 文件路径中加上了这个参数值"string"生成帮助信息的时候会生成这样
// -f <string> 文件路径
// 简单来说就是输入参数的一个提示信息,一般会是参数的类型,比如string,int,boolean等
private String description; // 描述信息
private boolean required; // 选项是否必须存在
private boolean optionalArg; // 参数值可选,比如可以是 -f filepath 或者直接 -f
private int argCount; // 设置接收参数的个数,有时候一个选项可能会接入多个参数值,一般都是一个
private Class<?> type; // 告诉接收参数的数据类型
private List<String> values; // 参数值列表,解析后的值会被存储到这里
private char valuesep; // values的分隔符
2.解析阶段
解析阶段通过创建对象CommandLineParser,并且调用parse方法,传入options和args来解析输入的参数,将其转换成一个CommandLine对象,然后进行操作
demo如下
// 定义阶段
Options options = new Options();
Option filePathOption = new Option("f", true, "文件路径");
filePathOption.setRequired(false); // 文件路径为必传选项
filePathOption.setArgName("string");
Option daemonRunOption = new Option("d", false, "后台执行");
Option helpOption = new Option("h", "help", false, "帮忙文档");
options.addOption(filePathOption);
options.addOption(daemonRunOption);
options.addOption(helpOption);
// 解析阶段
CommandLineParser parser = new DefaultParser();
CommandLine cmd = parser.parse(options, args);
这里 new 了一个DefaultParser,其实还有其他的Parser,例如BasicPaser,GnuParser,PosixParser,但是这些都弃用了,所以就用DefaultParser.
3.查询阶段
查询阶段主要是根据入参的类型进行对应的操作
// 查询阶段
if(args.length==0 || cmd.hasOption(helpOption)){//打印帮助信息(需要注意,如果某个参数是必选参数,在解析的时候就会报错,代码不会走到这里打印帮助信息)HelpFormatter formatter = new HelpFormatter();formatter.printHelp(" ",options);
}
// 获取文件路径
if(cmd.hasOption(filePathOption)){String filePath = cmd.getOptionValue(filePathOption);System.out.println("文件路径 : "+filePath);
}
// 后台运行
if(cmd.hasOption(daemonRunOption)){System.out.println("后台运行");
}
这里的判断如果再参数多的时候会写很长的if else,为了代码的健壮性可以使用策略模式(Strategy Pattern),将每个分支的处理逻辑对象封装成独立策略对象.
但是一般不会写很长的if else,通常会将接收到的参数转换成一个实体类然后进行之后的操作.
完整demo
import org.apache.commons.cli.*;public class TestCommonsCli {public static void main(String[] args) throws ParseException {// 定义阶段Options options = new Options();Option filePathOption = new Option("f", true, "文件路径");filePathOption.setRequired(false); // 文件路径为必传选项filePathOption.setArgName("string");Option daemonRunOption = new Option("d", false, "后台执行");Option helpOption = new Option("h", "help", false, "帮忙文档");options.addOption(filePathOption);options.addOption(daemonRunOption);options.addOption(helpOption);// 解析阶段CommandLineParser parser = new DefaultParser();CommandLine cmd = parser.parse(options, args);// 查询阶段if(args.length==0 || cmd.hasOption(helpOption)){HelpFormatter formatter = new HelpFormatter();formatter.printHelp(" ",options);}// 获取文件路径if(cmd.hasOption(filePathOption)){String filePath = cmd.getOptionValue(filePathOption);System.out.println("文件路径 : "+filePath);}// 后台运行if(cmd.hasOption(daemonRunOption)){System.out.println("后台运行");}}
}
帮助文档运行结果

代码地址 : https://github.com/codeAntg/Antgeek/tree/main/learning/apache/common/cli
参考
https://commons.apache.org/proper/commons-cli/
https://blog.csdn.net/SunnyYoona/article/details/128438785
https://iowiki.com/commons_cli/commons_cli_overview.html
https://blog.csdn.net/weixin_42116348/article/details/135189025
相关文章:
超强命令行解析工具Apache Commons CLI
概述 为什么要写这篇文章呢?因为在读flink cdc3.0源码的时候发现了这个工具包,感觉很牛,之前写过shell命令,shell是用getopts来处理命令行参数的,但是其实写起来很麻烦,长时间不写已经完全忘记了,现在才发现原来java也有这种工具类,所以先学习一下这个的使用,也许之后自己在写…...
JAVAEE——多线程进阶,锁策略
文章目录 锁策略乐观锁和悲观锁乐观锁悲观锁两者的比较 读写锁重量级锁和轻量级锁重量级锁轻量级锁 自旋锁公平锁和非公平锁公平锁非公平锁 可重入锁和不可重入锁可重入锁不可重入锁 锁策略 乐观锁和悲观锁 乐观锁 什么是乐观锁呢?我们可以认为乐观锁比较自信&am…...
富文本编辑器Quill全套教程
Quill简介 Quill是一款现代的富文本编辑器,它以其API驱动的设计和对文本格式的深度理解而著称。与传统的富文本编辑器不同,Quill专注于以字符为中心,构建了一个直观且易于使用的API,使得开发者能够轻松地对文本进行格式化和编辑。…...
Swift 代码注释的使用
Swift代码注释的使用 在 iOS 开发中,代码注释是一种很好的实践,可以帮助他人更容易理解你的代码。通常可以在代码中使用注释来解释代码的功能、目的、实现细节等。下面是一些常见的 iOS 代码注释示例: 1. 单行注释: // 这是一个…...
蓝桥杯—DS1302
目录 1.管脚 2.时序&官方提供的读写函数 3.如何使用读写函数 4.如何在数码管中显示在DS1302中读取出的数据? 1.管脚 2.时序&官方提供的读写函数 /* # DS1302代码片段说明1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考。2. 参赛选手可以自行…...
nginx: 集群环境配置搭建
nginx 集群环境搭建 1 ) 概述 nginx 本身就应该选择性能强劲的机器同时为了满足更多流量的需求, 多台nginx 机器做集群来满足强大的需求故而,我们需要一个负载均衡器,以及多台nginx的机器 这里负载均衡器应该有主从和热备,目前先使用一台来描…...
Linux:进程终止和等待
一、进程终止 main函数的返回值也叫做进程的退出码,一般0表示成功,非零表示失败。我们也可以用不同的数字来表示不同失败的原因。 echo $?//打印最近一次进程执行的退出码 而作为程序猿,我们更需要知道的是错误码所代表的错误信息&#x…...
一、next-auth 身份验证凭据-使用电子邮件和密码注册登录
一、next-auth 身份验证凭据-使用电子邮件和密码注册登录 文章目录 一、next-auth 身份验证凭据-使用电子邮件和密码注册登录一、前言二、前置准备1、环境配置2、相关库安装(1)vercel 配置(2)Yarn 包管理配置 3、next项目初始化与…...
2.SpringBoot利用Thymeleaf实现页面的展示
什么是Thymeleaf? Thymeleaf是一个现代服务器端Java模板引擎,适用于Web和独立环境,能够处理HTML,XML,JavaScript,CSS甚至纯文本。 Thymeleaf的主要目标是提供一种优雅且高度可维护的模板创建方式。为实现这…...
devtool: ‘source-map‘ 和 devtool: ‘#source-map‘的区别
devtool: ‘source-map’ 和 devtool: ‘#source-map’ 之间的区别主要在于前面的#字符。 从Webpack 4开始,就废弃了在devtool选项前加#的用法。 devtool: ‘source-map’ 选项意味着Webpack在构建过程中会生成独立的完整的source map文件。对于测试环境很有用&…...
Flutter Boost 3
社区的 issue 没有收敛的趋势。 设计过于复杂,概念太多。这让一个新手看 FlutterBoost 的代码很吃力。 这些问题促使我们重新梳理设计,为了彻底解决这些顽固的问题,我们做一次大升级,我们把这次升级命名为 FlutterBoost 3.0&am…...
ElementUI响应式Layout布局xs,sm,md,lg,xl
响应式布局 参照了 Bootstrap 的 响应式设计,预设了五个响应尺寸:xs、sm、md、lg 和 xl。 <el-row :gutter"10"><el-col :xs"8" :sm"6" :md"4" :lg"3" :xl"1"><div class…...
机器学习——典型的卷积神经网络
机器学习——典型的卷积神经网络 卷积神经网络(Convolutional Neural Networks,CNNs)是一类在图像处理领域应用广泛的深度学习模型。它通过卷积操作和池化操作来提取图像的特征,并通过全连接层来进行分类或回归任务。在本文中&am…...
速通数据结构与算法第四站 双链表
系列文章目录 速通数据结构与算法系列 1 速通数据结构与算法第一站 复杂度 http://t.csdnimg.cn/sxEGF 2 速通数据结构与算法第二站 顺序表 http://t.csdnimg.cn/WVyDb 3 速通数据结构与算法第三站 单链表 http://t.csdnimg.cn/cDpcC 感谢佬们…...
51单片机学习笔记12 SPI接口 使用1302时钟
51单片机学习笔记12 SPI接口 使用1302时钟 一、DS1302简介1. 功能特性2. 涓流充电3. 接口介绍时钟数据和控制线:电源线:备用电池连接: 二、寄存器介绍1. 控制寄存器2. 时间寄存器3. 日历/时钟寄存器 三、BCD码介绍四、DS1302时序1. 读时序2. …...
php编辑器 ide 主流编辑器的优缺点。phpstorm vscode atom 三者对比
编辑器PhpStormvscodeAtom是否收费收费,有30天试用期免费免费内存占用Java平台,一个进程1G多内存占用好几个进程,合起来1G上下/基本功能都具备,有的功能需要装插件都具备,有的功能需要装插件都具备,有的功能…...
【动手学深度学习】深入浅出深度学习之RMSProp算法的设计与实现
目录 🌞一、实验目的 🌞二、实验准备 🌞三、实验内容 🌼1. 认识RMSProp算法 🌼2. 在optimizer_compare_naive.py中加入RMSProp 🌼3. 在optimizer_compare_mnist.py中加入RMSProp 🌼4. 问…...
大转盘抽奖小程序源码
源码介绍 大转盘抽奖小程序源码,测试依旧可用,无BUG,跑马灯旋转效果,非常酷炫。 小程序核心代码参考 //index.js //获取应用实例 var app getApp() Page({data: {circleList: [],//圆点数组awardList: [],//奖品数组colorCirc…...
数据结构(无图版)
数据结构与算法(无图版,C语言实现) 1、绪论 1.1、数据结构的研究内容 一般应用步骤:分析问题,提取操作对象,分析操作对象之间的关系,建立数学模型。 1.2、基本概念和术语 数据:…...
软件测试中的顶级测试覆盖率技术
根据 CISQ 报告,劣质软件每年给美国公司造成约2.08 万亿美元的损失。虽然软件工具是企业和行业领域的必需品,但它们也容易出现严重错误和性能问题。人类手动测试不再足以检测和消除软件错误。 因此,产品或软件开发公司必须转向自动化测试&am…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...
k8s从入门到放弃之HPA控制器
k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...
前端调试HTTP状态码
1xx(信息类状态码) 这类状态码表示临时响应,需要客户端继续处理请求。 100 Continue 服务器已收到请求的初始部分,客户端应继续发送剩余部分。 2xx(成功类状态码) 表示请求已成功被服务器接收、理解并处…...
[拓扑优化] 1.概述
常见的拓扑优化方法有:均匀化法、变密度法、渐进结构优化法、水平集法、移动可变形组件法等。 常见的数值计算方法有:有限元法、有限差分法、边界元法、离散元法、无网格法、扩展有限元法、等几何分析等。 将上述数值计算方法与拓扑优化方法结合&#…...
算法250609 高精度
加法 #include<stdio.h> #include<iostream> #include<string.h> #include<math.h> #include<algorithm> using namespace std; char input1[205]; char input2[205]; int main(){while(scanf("%s%s",input1,input2)!EOF){int a[205]…...
