超强命令行解析工具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("后台运行");
        }
        
    }
}

帮助文档运行结果
image.png
代码地址 : 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/513116.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

封装一个vue3的公共组件

在Vue 3中&#xff0c;封装公共组件的场景包括但不限于以下几种情况&#xff1a; 重复使用的组件&#xff1a;如果你发现某个组件在多个地方重复使用&#xff0c;那么将其封装成公共组件是很有意义的。比如&#xff0c;页面中的各种表单控件&#xff08;输入框、下拉框、日期选…

梵宁教育春日主题大奖赛

梵宁教育春日主题大赛正式拉开帷幕&#xff0c;我们诚挚邀请各位同学积极参与&#xff0c;用你们的创意和才华诠释春天的魅力。 本次大赛以春日为主题&#xff0c;参赛作品形式多样&#xff0c;包括海报设计和剪辑创作。我们鼓励同学们发挥想象力&#xff0c;将春天的美好瞬间、…

Golang和Java的对决:从设计理念到工具链的全面比较

文章目录 使用率排名Golang和Java设计理念语法和类型系统并发处理资源消耗生态系统和工具链 结语 使用率排名 据最新的2024年3月 Tiobe 编程语言排行榜&#xff0c;目前 Golang 的使用率排名为第8呈上升趋势&#xff0c;Java 的使用率排名为第4呈下降趋势 2024年3月2023年3月…

Go——函数

一. 函数定义 1.1 特点 无需声明原型支持不定变参支持多返回值支持命名返回参数支持匿名函数和闭包函数也是一种类型&#xff0c;一种函数可以赋值给变量不支持嵌套&#xff0c;一个包不能有两个名字一样的函数不支持重载不支持默认参数 1.2 函数声明 函数声明包含一个函数名&…

谈谈考研数学几个常见误区

25考研数学&#xff0c;一定一定要吃透基础&#xff0c;练好计算 我之所以要强调这个&#xff0c;是因为现在的考研数学&#xff0c;越来越重视基础和计算的考察&#xff0c;题海战术已经过时&#xff0c;如果想要有效的提升自己&#xff0c;要进行针对性的学习。我去年考研的…

【.NET全栈】.NET全栈学习路线

一、微软官方C#学习 https://learn.microsoft.com/zh-cn/dotnet/csharp/tour-of-csharp/ C#中的数据类型 二、2021 ASP.NET Core 开发者路线图 GitHub地址&#xff1a;https://github.com/MoienTajik/AspNetCore-Developer-Roadmap/blob/master/ReadMe.zh-Hans.md 三、路线…

常州威雅:「西陵氏奖学金」项目,只为寻找优秀的你!

栀子花开&#xff0c;凤凰花落&#xff0c;又是一年中考季。站在深耕“全人教育”的第十年&#xff0c;常州威雅现今面向全社会的优秀初三学子&#xff0c;首次推出「西陵氏奖学金」项目&#xff0c;助力梦想起航。 西陵氏女嫘祖&#xff0c;华夏文明的奠基人。她所发现、发明的…

Flutter iOS上架指南

本文探讨了使用Flutter开发的iOS应用能否上架&#xff0c;以及上架的具体流程。苹果提供了App Store作为正式上架渠道&#xff0c;同时也有TestFlight供开发者进行内测。合规并通过审核后&#xff0c;Flutter应用可以顺利上架。但上架过程可能存在一些挑战&#xff0c;因此可能…

VMware虚拟机三种网络模式配置

vmware有三种网络工作模式&#xff1a;Bridged&#xff08;桥接模式&#xff09;、NAT&#xff08;网络地址转换模式&#xff09;、Host-Only&#xff08;仅主机模式&#xff09;。 1. 打开网络编辑器&#xff08;编辑 --> 虚拟网络编辑器&#xff09; 在主机上有VMware Ne…

提效5倍,传统零售企业实时数据分析策略与应用实践

国家统计局数据显示&#xff0c;在过去的 2023 年里&#xff0c;中国社会消费品零售额整体增长稳定&#xff0c;零售业态消费开始恢复性增长。 同时&#xff0c;随着移动互联网的持续爆发增长&#xff0c;零售市场的竞争仍日益激烈。传统零售企业不仅要面对来自其他传统零售商的…

C++ 中的 vector 的模拟实现【代码纯享】

文章目录 C 中的 vector 模拟实现1. vector 的基本概念2. vector 的基本操作3. vector 的模拟实现4.代码纯享5. 总结 C 中的 vector 模拟实现 在 C 中&#xff0c;vector 是一个非常重要的容器&#xff0c;它提供了动态数组的功能。在本篇博客中&#xff0c;我们将尝试模拟实现…

结构体,联合体,枚举( 2 )

目录 2.联合体 2.1联合体类型的声明 2.2联合体的特点 2.3联合体的内存大小 3.枚举 3.1枚举类型的声明 3.2枚举类型的优点 3.3枚举类型的使用 2.联合体 联合体&#xff08;Union&#xff09;是另一种复合数据类型&#xff0c;它允许我们在同一内存位置存储不同的数据类型…

携程获取景点详情 API 返回值说明,item_get_scenic-获取景点详情

xiecheng.item_get_scenic 请求示例&#xff0c;API接口接入Anzexi58 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_sea…

AI预测福彩3D第25弹【2024年4月2日预测--第6套算法开始计算第2次测试】

今天&#xff0c;咱们进行第6套算法测试&#xff0c;本套算法将结合012路直选共27种组合&#xff0c;同时考虑了对012路的和值进行统计分析。今天为第2次测试&#xff0c;好了&#xff0c;废话不多说了。直接上结果~ 仍旧是分为两个方案&#xff0c;1大1小。 经过人工神经网络计…

使用minikube安装使用单机版K8S(docker)

前置&#xff1a;作为一个开发&#xff0c;工作之余想玩一下k8s&#xff0c;但是搭建成本太高&#xff0c;所以就找到了minikube这个工具&#xff0c;快速搭建单机版k8s&#xff0c;下面是个人搭建流程&#xff0c;基于centos7&#xff0c;仅供参考。 1.下载kubectl&#xff0…

[强推] 免费AI学习资料丨学习完还能获得微软证书,太香了!

五分钟白嫖一张微软学习证书 &#x1f4c5; 重要日期&#xff1a; &#x1f680; 开始&#xff1a;2024年4月1日 &#x1f51a; 结束&#xff1a;2024年5月1日 如何参与&#xff1a; &#x1f517; 挑战链接&#xff1a;立即参与 &#x1f4c3; 提交表格&#xff1a;提交…

智慧公厕:提升城市公卫管理效率与环境舒适度的利器

公厕作为城市基础设施的重要组成部分&#xff0c;一直以来备受市民们的关注与诟病。然而&#xff0c;随着科技的发展和城市智慧化进程的推进&#xff0c;智慧公厕作为一种集成了物联网等技术的创新型公厕逐渐走入人们的视野。智慧公厕不仅实现了信息化、数字化和智慧化&#xf…

ATFX汇市:小非农ADP数据来袭,将为周五大非农提供前瞻指引

ATFX汇市&#xff1a;今日20:15&#xff0c;美国自动数据处理公司将公布美国3月ADP就业人数&#xff0c;前值为增加14万人&#xff0c;预期值增加14.8万人。上图为美国ADP数据的历史表现&#xff0c;最近七个月&#xff0c;新增就业人口的柱线呈现出显著震荡特征&#xff0c;最…

VPN——GRE

1、VPN概念 Virtual Private Network ①虚拟专用网络 ②在公有的网络上架设私有的通道&#xff0c;构建一个专用的、安全性、服务质量得到保障的网络 ③实质&#xff1a;数据包的再封装与解封装的过程 2、分类 按照业务用途&#xff1a;【1】access&#xff1a;外出员工…

【Go】十七、进程、线程、协程

文章目录 1、进程、线程2、协程3、主死从随4、启动多个协程5、使用WaitGroup控制协程退出6、多协程操作同一个数据7、互斥锁8、读写锁9、deferrecover优化多协程 1、进程、线程 进程作为资源分配的单位&#xff0c;在内存中会为每个进程分配不同的内存区域 一个进程下面有多个…