JAVA基础 - 使用CommandLine解析命令行参数

news2024/11/24 17:26:47

它是什么

commons-cli 是一个强大而的开源的命令行参数传递与解析的解决方案,用于接收MAIN方法的args参数。可以通过设置短选项(即选项名简写)、长选项(即全写)、设置是否需要携带选项参数(指定为 false 时,表示此选项不带参数,即为布尔选项)和描述信息来定义参数选项。
官网:https://commons.apache.org/proper/commons-cli/index.html

请先阅读该博文:
CENTOS下的命令行参数:https://blog.csdn.net/goodjava2007/article/details/131083116

编码步骤

(1)定义参数

Options options = new Options();

(2)解析参数

CommandLine cmd = new BasicParser().parse(options, args);
// 或者
CommandLine cmd = new DefaultParser().parse(options, args);
// 或者
CommandLine cmd = new PosixParser().parse(options, args);
// 或者
CommandLine cmd = new GnuParser().parse(options, args);

(3)获取参数

String db = cmd.getOptionValue("d")

参数风格

序号风格类型参数描述解析器
1POSIX风格参数以“-”开头的单个字符的POSIX风格的参数,如:tar -zxvf foo.tar.gzPosixParser
2GNU风格参数以“- -”后接选项关键字的GNU风格的参数,GNU风格兼容POSIX风格,如:du - -human-readable - -max-depth=1GnuParser
3JAVA风格参数以“-D”开头的参数,如:java -Datlas.log.file=import-hive.log -Dlog4j.configuration=atlas-hive-import-log4j.xmlDefaultParser
4短选项参数以“-”开头的单个字符参数,即:横杠+参数名+空格+参数值(空格也可以不带),如:import-hive.sh -dmallx -tmallx_order 或者 import-hive.sh -d mallx -t mallx_order 都可以DefaultParser / BasicParser
5长选项参数以“-”开头的多个字符参数,如:ant -projecthelpDefaultParser / BasicParser

注:以上表格说明的是参数风格,至于某个参数后面是否带参数对应的值,需要在选项的代码中进行设置。

如何使用

① 依赖引入
<dependency>
  <groupId>commons-cli</groupId>
  <artifactId>commons-cli</artifactId>
  <version>1.4</version>
</dependency>
② 示例代码
public class MyCommandLine {

    public static void main(String[] args) {
        MyCommandLine mcl = new MyCommandLine();
        mcl.defaultParser(args);
    }


    private void defaultParser(String[] args) {
        Options options = new Options();
        try {

            // 1.1 构造参数
            options.addOption("help", "如何使用mcl指令");
            options.addOption("d", "database", true, "指定数据库名");
            options.addOption("t", "table", true, "指定表名");
            options.addOption("s", "size", true, "指定文件的大小");
            options.addOption("f", "filename", true, "指定文件的全路径名");
            options.addOption("failOnError", false, "指定出现错误是是否停止");

            Option property = Option.builder("D")
                    .argName("property=value")
                    .hasArgs()
                    .valueSeparator('=')
                    .desc("指定KEY=VALUE形式的参数")
                    .build();

            options.addOption(property);


            // 1.2 解析
            CommandLine cmd = new DefaultParser().parse(options, args);

            // 1.3 取值
            boolean failOnError = cmd.hasOption("failOnError");
            String db = cmd.getOptionValue("d");       // 数据库
            String table = cmd.getOptionValue("t");    // 表
            String size = cmd.getOptionValue("s");     // 表大小
            String file = cmd.getOptionValue("f");     // 文件
            String log = cmd.getOptionProperties("D").getProperty("atlas.log");
            // 以下仅仅用于测试
            // 输出USAGE
            System.out.println(getHelp(options));
            // 输出参数
            System.out.println(String.format("The db is: %s, table is: %s, size is : %s, file is: %s, log is %s", db, table, size, file, log));
        } catch (Exception e) {

        } finally {

        }
    }

    private String getHelp(Options options) {
        HelpFormatter helper = new HelpFormatter();

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        PrintWriter printWriter = new PrintWriter(byteArrayOutputStream);
        helper.printHelp(printWriter, HelpFormatter.DEFAULT_WIDTH, "mcl -help", null,
                options, HelpFormatter.DEFAULT_LEFT_PAD, HelpFormatter.DEFAULT_DESC_PAD, null);
        printWriter.flush();
        String help = new String(byteArrayOutputStream.toByteArray());
        printWriter.close();
        return help;
    }
}
③ 示例测试

在IDEA中进行参数设置,如下:

"Program arguments" 输入框中如下设置:
-d mallx -tmallx_order -s1000 -Datlas.log=import-hive.log -f D:\02-工作空间\06-代码空间\04-gitee\rills-atlas-2.1.0-rc3\README.txt

在这里插入图片描述

④ 执行结果
usage: mcl -help
 -d,--database <arg>   指定数据库名
 -D <property=value>   指定KEY=VALUE形式的参数
 -f,--filename <arg>   指定文件的全路径名
 -failOnError          指定出现错误是是否停止
 -help                 如何使用mcl指令
 -s,--size <arg>       指定文件的大小
 -t,--table <arg>      指定表名

The db is: mallx, table is: mallx_order, size is : 1000, file is: D:\02-工作空间\06-代码空间\04-gitee\rills-atlas-2.1.0-rc3\README.txt, log is import-hive.log
⑤ 官方示例

COMMONS CLI 官方示例:https://commons.apache.org/proper/commons-cli/usage.html

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jenkins python api与json api不同

查看jenkins的python api与json api&#xff0c;感觉两者相差不多&#xff0c;但还是有所区别&#xff0c;所以用BeyondCompare进行对比分析。 1、jenkins base url的api对比 左侧的为&#xff1a;http://server:port/jenkins/api/python?prettytrue 右侧的为&#xff1a;h…

提示工程师指南4-ChatGPT Prompt Engineering

ChatGPT Prompt Engineering 在这个部分&#xff0c;我们将介绍 ChatGPT 的最新提示工程技术&#xff0c;包括技巧、应用、限制、论文和额外的阅读材料。 主题&#xff1a; 与 ChatGPT 对话 Python 笔记本 请注意&#xff0c;本部分正在紧密开发中。 文章目录 ChatGPT Promp…

【爬虫】3.4 爬取网站复杂数据

1. Web服务器网站 进一步把前面的Web网站的mysql.html, python.html, java.html丰富其中 的内容&#xff0c;并加上图形&#xff1a; mysql.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>my…

手把手教你看懂51单片机原理图

最近当了单片机课设的助教,又再次接触了51单片机。发现初学者还看不太原理图&#xff0c;不能理解单片机 led灯&#xff0c;蜂鸣器&#xff0c;数码管是怎么操作的。现在结合原理图讲解一下怎么操作这些外设模块&#xff01;我们就以一些初始化代码进行讲解。 注&#xff1a;这…

开始使用Vue 3时应避免的10个错误

本文首发于微信公众号&#xff1a;大迁世界, 我的微信&#xff1a;qq449245884&#xff0c;我会第一时间和你分享前端行业趋势&#xff0c;学习途径等等。 更多开源作品请看 GitHub https://github.com/qq449245884/xiaozhi &#xff0c;包含一线大厂面试完整考点、资料以及我的…

华为OD机试真题 Java 实现【在字符串中找出连续最长的数字串】【2023 B卷 100分】,附详细解题思路

一、题目描述 输入一个字符串&#xff0c;返回其最长的数字子串&#xff0c;以及其长度。 若有多个最长的数字子串&#xff0c;则将它们全部输出&#xff08;按原字符串的相对位置&#xff09;。 本题含有多组样例输入。 数据范围&#xff1a; 字符串长度 1≤n≤200 &…

Linux进程懂了吗?一分钟快速上手

这里写目录标题 Linux进程介绍显示系统执行的进程终止进程查看进程树pstreeLinux进程作用 Linux进程介绍 Linux进程是计算机中正在运行的程序的实例。在Linux系统中&#xff0c;每个进程都有一个唯一的进程ID&#xff08;PID&#xff09;&#xff0c;用于标识该进程。&#xf…

Eigen中用于特征值分解的几个类的介绍

本文参考于 https://eigen.tuxfamily.org/dox/group__TopicLinearAlgebraDecompositions.html 很多场合我们需要去计算矩阵的特征值与特征向量&#xff0c;但是Eigen中有好几个计算特征值与特征向量的方法&#xff0c;这些方法到底该选哪个呢&#xff1f;这篇文章就带着大家来…

「企业技术架构」EA874:技术架构的原则和标准

企业技术架构中EA原则的应用 原则经常是正式EA工作的一部分。它们在个人决策和广泛适用且独立于具体决策的基本业务目标之间提供了更强的联系。原则是组织为激发最佳行为而选择的准则或最佳实践。它们很可能&#xff08;在最高级别&#xff09;被追溯到基本的业务需求和策略。如…

【MySQL数据库 | 第八篇】DML操作

目录 ​编辑 &#x1f914;前言&#xff1a; &#x1f914;DML介绍&#xff1a; &#x1f914;语法详情&#xff1a; &#x1f600;1.插入数据&#xff1a; 特点&#xff1a; 1.给指定字段添加数据&#xff1a; 代码示例: 运行结果&#xff1a; 2.给所有的字段添加数据&…

Symfony v6.2.11 正式发布,经典 PHP Web 开发框架

导读Symfony v6.2.11 发布了&#xff01;Symfony 是一款基于 MVC 架构的 PHP 框架&#xff0c;致力于减少重复代码的编写&#xff0c;以加速 Web 应用的开发和维护。Symfony 与许多关系型数据库集成的也非常好&#xff0c;成本也较小。 此外&#xff0c;Symfony 致力于在企业背…

继电器在信号系统中的应用

继电器是什么 继电器是一种电气开关&#xff0c;它使用电磁力来控制一个或多个电气电路的操作。继电器通常由电磁铁、触点和弹簧等部件组成。当电磁铁被激活时&#xff0c;它会产生磁场&#xff0c;吸引或释放触点&#xff0c;从而打开或关闭电路。 继电器的分类 继电器分为…

面向对象设计中的七大设计原则与二十三种设计模式

目录 七大设计原则单一职责原则内涵与目的涉及的知识点例子 开闭原则定义实现例子 依赖倒转原则定义传统过程式设计面向对象设计与开闭原则的联系例子 里氏替换原则定义与意义四层含义例子 接口隔离原则定义例子 合成复用原则定义继承复用与组合/聚合复用的区别涉及的知识点例子…

c++11 标准模板(STL)(std::bitset)(七)

定义于头文件 <bitset> template< std::size_t N > class bitset; 类模板 bitset 表示一个 N 位的固定大小序列。可以用标准逻辑运算符操作位集&#xff0c;并将它与字符串和整数相互转换。 bitset 满足可复制构造 (CopyConstructible) 及可复制赋值 (CopyAssig…

LeetCode_二叉树_BFS_中等_199.二叉树的右视图

目录 1.题目2.思路3.代码实现&#xff08;Java&#xff09; 1.题目 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1&#xff1a; 输入: [1,2,3,null,5,null,4] 输出: [1,…

测试计划包括哪些主要步骤和信息?

测试计划包括哪些主要步骤和信息? 在软件测试的过程中&#xff0c;编写一个完整的测试计划是非常重要的一步。测试计划记录了测试的具体内容、步骤、目标及其实现计划、测试环境和相关资源等信息。下面将为您详细介绍测试计划包括哪些主要步骤和信息。 1. 测试概述 测试概述部…

centos7 部署 Mysql 5.7

centos7 部署 Mysql 5.7 一、安装2.1 环境准备2.2 开始安装2.2.1 安装源2.2.2 版本选择2.2.3 安装 MySQL 二、MySQL 设置2.1 密码设置2.2 远程访问账户设置2.3 设置开机启动 一、安装 2.1 环境准备 1、查看系统自带或之前安装的 mariadb。 rpm -qa | grep mariadb2、卸载它们…

Nginx+Tomcat实现负载均衡、动静分离集群部署

NginxTomcat实现负载均衡、动静分离集群部署 一、Tomcat多实例部署1、安装好JDK2、安装tomcat3、配置tomcat环境变量4、修改tomcat2中的server.xml文件&#xff0c;要求各tomcat实例配置不能有重复的端口号5、修改各tomcat实例中的startup.sh和shutdown.sh文件&#xff0c;添加…

ArrayList 万字长文解析:使用、优化、源码分析

文章目录 ArrayList 万字长文解析&#xff1a;使用、优化、源码分析前言ArrayList 简介ArrayList 的基本使用方法ArrayList 性能优化ArrayList 的源码分析内部结构构造方法解析扩容机制System.arraycop与 Arrays.copyof 实现方式 与 使用场景迭代器 JDK 8版本 ArrayList bug 示…