关于命令行参数解析的库还挺多,调研之后选择了 picocli 这个库

因为其文档很全,所以下面是一个快速使用的教程,抓住主干再揪细节。

        <dependency><groupId>info.picocli</groupId><artifactId>picocli</artifactId><version>4.5.2</version></dependency>

效果

先看看,再实现

$ java -jar cli.jar -h
Usage: java -jar cli.jar [-hV] -p=<secret> -u=<user> [-c=<String=String>]...-s=<servers>[,<servers>...] [-s=<servers>[,<servers>...]]...-c, --config=<String=String>-c k1=v1 -c k2=v2-h, --help                Show this help message and exit.-p, --password=<secret>   login secret or password-s, --server=<servers>[,<servers>...]servers,split by comma: host1:port1,host2:port2-u, --user=<user>         login username-V, --version             Print version information and exit.

定义参数类

使用注解来定义参数类

一般只需要2个注解即可搞定:

  • @CommandLine.Command: 定义在类上,声明应用执行名字,版本等
  • @CommandLine.Option: 用在属性上,代表参数

下面是一个示例:

import picocli.CommandLine;import java.util.Map;@CommandLine.Command(name = "java -jar cli.jar")
public class CliParam {@CommandLine.Option(names = {"-h", "--help"}, usageHelp = true, description = " cmd cli help msg")public boolean help = false;@CommandLine.Option(names = {"-s", "--server"}, required = true, split = ",", converter = ServerTypeConverter.class,description = " servers,split by comma: host1:port1,host2:port2 ")public String[] servers;@CommandLine.Option(names = {"-u", "--user"}, required = true, description = "login username")public String user;@CommandLine.Option(names = {"-p", "--password"}, required = true,description = "login secret or password")public String secret;/*** 一些额外的参数*/@CommandLine.Option(names = {"-c", "--config"}, description = " -c k1=v1 -c k2=v2")public Map<String, String> configs;static class ServerTypeConverter implements CommandLine.ITypeConverter<String> {@Overridepublic String convert(String s) {final String[] hp = s.split(":");if (hp.length != 2) {throw new CommandLine.TypeConversionException("Invalid servers, must be: host1:port1,host2:port2," +" but was:'" + s + "'");}String host = hp[0].trim();int port = Integer.parseInt(hp[1].trim());return host + (port == 80 ? "" : ":" + port);}}
}

其中ServerTypeConverter可以自定义解析,这里接收一个逗号分割的字符串,返回一个数组。

声明版本

可以直接写死,也可以动态加载

@CommandLine.Command(name = "java -jar cli.jar",versionProvider = CliParam.MyVersionProvider.class)
public class CliParam {/*** 动态获取版本号,从内部配置里获取*/static class MyVersionProvider implements CommandLine.IVersionProvider {@Overridepublic String[] getVersion() throws Exception {final InputStream in = MyVersionProvider.class.getClassLoader().getResourceAsStream("config.properties");final Properties p = new Properties();p.load(in);return new String[]{"My APP", "Version " + p.getProperty("version", "unknown")};}}
}

进阶

我们知道每个命令行都会有 -h-v这俩选项,所以人家早就考虑好了。

只需要一个选项即可:

@CommandLine.Command(name = "java -jar cli.jar",mixinStandardHelpOptions = true,versionProvider = CliParam.MyVersionProvider.class)
public class CliParam {}

使用参数解析

定义完了,就需要在main方法里解析了。

    public static void main(String[] args) throws Exception {// 解析参数final CliParam CliParam = new CliParam();final CommandLine commandLine = new CommandLine(CliParam);try {final CommandLine.ParseResult parseResult = commandLine.parseArgs(args);if (parseResult.isUsageHelpRequested()) {commandLine.usage(System.out);System.exit(0);}if (parseResult.isVersionHelpRequested()) {commandLine.printVersionHelp(System.out);System.exit(0);}CliParam.setINSTANCE(CliParam);} catch (CommandLine.ParameterException e) {commandLine.usage(System.out);System.exit(1);}// 使用 cliParam

当遇到未知参数时,会抛出 CommandLine.ParameterException, 捕获了打印help即可。
正常解析完如果是 -V,也需要打印版本号然后退出。

更多强大功能,请参考文档。

命令行参数解析picocli快速使用相关推荐

  1. 编程模板-R语言脚本写作:最简单的统计与绘图,包安装、命令行参数解析、文件读取、表格和矢量图输出

    写在前面 个人认为:是否能熟悉使用Shell(项目流程搭建)+R(数据统计与可视化)+Perl/Python等(胶水语言,数据格式转换,软件间衔接)三门语言是一位合格生物信息工程师的标准. 之前分享过 ...

  2. linux shell中的命令自动补全(compgen complete)与 命令行参数解析

    linux shell中的命令自动补全(compgen complete)与 命令行参数解析 标签: shell脚本 2013-12-31 21:56 6661人阅读 评论(6) 收藏 举报 分类: ...

  3. 安装rpm包命令_编程模板-R语言脚本写作:最简单的统计与绘图,包安装、命令行参数解析、文件读取、表格和矢量图输出...

    不常用R的朋友,可能并不能意识到好的编辑模板带来的长期效率提高和代码重用性,非计算机专业科研人员且需要使用R语言,此文会对您有帮助. 个人认为:是否能熟悉使用Shell(项目流程搭建)+R(数据统计与 ...

  4. 【Qt】通过QtCreator源码学习Qt(六):命令行参数解析实现

    参考下大神的命令行参数解析是如何是实现的 //使用const char []代替宏定义字符串,我以前都是用const QString,想想好傻 const char SETTINGS_OPTION[] ...

  5. python命令行参数解析OptionParser类用法实例

    python命令行参数解析OptionParser类用法实例 本文实例讲述了python命令行参数解析OptionParser类的用法,分享给大家供大家参考. 具体代码如下:     from opt ...

  6. 3gpp文件头文件解析_居于LLVM 的命令行参数解析

    在写命令行程序的时候经常需要解析各种命令行参数.打印help信息等,觉得非常的麻烦.今天介绍一种超级棒的命令参数解析的方法:居于LLVM 的命令行参数解析,有了它妈妈再也不用担心我不会解析命令行参数^ ...

  7. Python命令行参数解析模块------argparse

      首先,argparse 是python自带的命令行参数解析包,可以用来方便地读取命令行参数,当你的代码需要频繁地修改参数的时候,使用这个工具可以将参数和代码分离开来,让你的代码更简洁,适用范围更广 ...

  8. Python中最好用的命令行参数解析工具

    Python 做为一个脚本语言,可以很方便地写各种工具.当你在服务端要运行一个工具或服务时,输入参数似乎是一种硬需(当然你也可以通过配置文件来实现). 如果要以命令行执行,那你需要解析一个命令行参数解 ...

  9. python 命令行参数-Python 中最好用的命令行参数解析工具

    Python 做为一个脚本语言,可以很方便地写各种工具.当你在服务端要运行一个工具或服务时,输入参数似乎是一种硬需(当然你也可以通过配置文件来实现). 如果要以命令行执行,那你需要一个命令行参数解析的 ...

最新文章

  1. java中的pattern_Java Pattern的用法是什么?
  2. [特征工程系列五]基于蒙特卡洛搜索树的半自动特征工程方案
  3. HTML内嵌式CSS背景图填充满无截断重复
  4. 简练软考知识点整理-项目合同的类型
  5. 《Linux内核设计与实现》读书笔记(十四)- 块I/O层
  6. Android复习01(内部存储、外部存储、SD卡存储、XML解析、Json解析、保存登录密码)
  7. 大厂也在用的6种数据脱敏方案,醍醐灌顶!
  8. 嵌入式电路设计(第一个商业pcb电路图绘制)
  9. 手动生成/etc/shadow文件中的密码
  10. 软件测试基础知识【归纳】
  11. c语言冒泡排序字母排序,排序与查找之冒泡排序篇(C语言实现)
  12. 19.Java 数据库编程
  13. 常见计算机录制屏幕软件名称,录制电脑屏幕视频的软件有什么?
  14. 数学建模国赛论文latex代码汇总
  15. Facebook更名Meta,扎克伯格押注元宇宙
  16. makefile终极目标
  17. #后疫情时代的新思考#AI助力,“无接触”服务加速金融数字化转型丨数据猿公益策划...
  18. Bootstrap3基础 btn-primary/warning... 三类按钮的六种样式
  19. 基于协同过滤的电影推荐
  20. Android 亮屏流程分析

热门文章

  1. ElasticSearch核心概念以及基本操作
  2. 【Linux从青铜到王者】第十五篇:Linux网络编程套接字两万字详解
  3. mapReduce:网站日志分析项目案例:数据清洗
  4. Echarts动态加载多条折线图
  5. 斗罗大陆3d游戏策划
  6. linux命令数字表示法
  7. 60句高傲得心碎的句子
  8. Modbus 红尘幻海
  9. [评论]究竟什么才是自主研发和自主知识产权?
  10. (免费分享)基于jsp酒店管理系统(配套论文)