超强命令行解析工具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…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...

华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...