Apache Commons CLI 入门教程:轻松解析命令行参数

文章目录

  • Apache Commons CLI 入门教程:轻松解析命令行参数
    • 一、什么是 Commons CLI?
    • 二、为什么选择 Commons CLI?
    • 三、快速开始
      • 1. 添加依赖
      • 2. 基础示例
      • 3. 运行示例
        • 1. 在Idea中运行
        • 2. 命令行中运行
        • 3. 使用 Maven/Gradle 运行(推荐)
      • 4. 使用可运行jar运行
        • 1. 配置pom.xml
        • 2. 执行打包任务
        • 3. 查看生成的jar文件
        • 4. 运行jar文件
    • 四、核心概念详解
      • 1. 选项定义
      • 2. 选项类型
      • 3. 参数解析
      • 4. 帮助信息
    • 五、实战案例
      • 1. 文件处理工具
      • 2. 配置加载工具
    • 六、最佳实践
    • 七、常见问题解答
    • 八、总结

Apache Commons CLI 入门教程:轻松解析命令行参数

一、什么是 Commons CLI?

Apache Commons CLI 是一个简单易用的 Java 库,专门用于解析命令行参数。当我们需要开发命令行工具或应用程序时,它可以帮助我们:

  • 定义程序接受的参数格式
  • 自动解析用户输入的命令行参数
  • 生成标准化的帮助信息
  • 验证参数的正确性

二、为什么选择 Commons CLI?

相比自己编写参数解析逻辑,使用 Commons CLI 有以下优势:

  1. 标准化:遵循 Unix/Linux 命令行工具的标准惯例
  2. 功能完善:支持长短选项、必选/可选参数、参数分组等
  3. 易用性:API 设计直观,学习曲线平缓
  4. 健壮性:经过广泛测试,能处理各种边界情况

三、快速开始

1. 添加依赖

首先需要在项目中添加 Commons CLI 的依赖:

Maven 项目

<dependency><groupId>commons-cli</groupId><artifactId>commons-cli</artifactId><version>1.9.0</version>
</dependency>

Gradle 项目

implementation 'commons-cli:commons-cli:1.9.0'

上述依赖中的版本号 1.9.0 是当前最新版本,以下代码均以当前版本为准。如果您需要在生产环境使用,请及时更新为最新版本。

2. 基础示例

让我们从一个最简单的例子开始:

package org.hbin.cli;import org.apache.commons.cli.*;public class GreetApp {public static void main(String[] args) {// 1. 创建选项定义Options options = new Options();options.addOption("n", "name", true, "指定您的名字");// 2. 创建解析器CommandLineParser parser = new DefaultParser();HelpFormatter formatter = new HelpFormatter();try {// 3. 解析参数CommandLine cmd = parser.parse(options, args);// 4. 处理参数if (cmd.hasOption("n")) {String name = cmd.getOptionValue("n");System.out.println("你好, " + name + "!");} else {System.out.println("你好, 世界!");}} catch (ParseException e) {System.err.println("参数错误: " + e.getMessage());formatter.printHelp("greet", options);System.exit(1);}}
}

3. 运行示例

1. 在Idea中运行

在这里插入图片描述
在这里插入图片描述

2. 命令行中运行
> java org.hbin.cli.GreetApp -n Haley

注意,直接运行上述命令可能会报错 java.lang.NoClassDefFoundError,如下图:
在这里插入图片描述
这是因为运行时classpath中缺少Commons CLI的jar文件,需要指定其路径。

> java -cp .;%MAVEN_HOME%\repo\commons-cli\commons-cli\1.9.0\commons-cli-1.9.0.jar org.hbin.cli.GreetApp -n Haley
3. 使用 Maven/Gradle 运行(推荐)

如果是Maven项目:

mvn compile exec:java -Dexec.mainClass="org.hbin.cli.GreetApp" -Dexec.args="-n Haley"

如果是Gradle项目:

gradle run --args="-n Haley"

4. 使用可运行jar运行

上述代码也可以使用Maven Assembly Plugin制作成一个可运行jar,然后再运行。步骤如下:

1. 配置pom.xml
<build><plugins><!-- 配置 maven-assembly-plugin --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><version>3.3.0</version><configuration><archive><manifest><!-- 指定主类 --><mainClass>org.hbin.cli.GreetApp</mainClass></manifest></archive><descriptorRefs><!-- 使用预定义的 jar-with-dependencies 描述符 --><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs></configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin></plugins>
</build>
2. 执行打包任务

双击 maven 面板中的 package 执行打包或使用命令行打包:mvn clean package

3. 查看生成的jar文件

打包完成后,在项目的 target 目录下会生成两个 Jar 文件:

  • CliExample-1.0-SNAPSHOT.jar - 不包含依赖的基本 Jar
  • CliExample-1.0-SNAPSHOT-jar-with-dependencies.jar - 包含所有依赖的可运行 Jar
4. 运行jar文件
java -jar target/CliExample-1.0-SNAPSHOT-jar-with-dependencies.jar -n Haley

四、核心概念详解

1. 选项定义

Commons CLI 使用 Options 类来定义程序接受的参数:

Options options = new Options();// 简单选项
options.addOption("h", "help", false, "显示帮助信息");// 带参数的选项
options.addOption("n", "name", true, "指定输入名称");// 使用构建器模式创建复杂选项
options.addOption(Option.builder("n").longOpt("name").hasArg().argName("NAME").desc("指定名称").build());

2. 选项类型

类型示例说明
无参选项-h, --help只表示一个开关状态
带参选项-n Haley需要接收一个参数
可选参数-d [debugLevel]参数可有可无
多值选项-Dkey1=value1 -Dkey2=value2可以接收多个键值对

3. 参数解析

使用 DefaultParser 解析命令行参数:

CommandLineParser parser = new DefaultParser();
try {CommandLine cmd = parser.parse(options, args);// 检查选项是否存在if (cmd.hasOption("h")) {// 处理帮助选项}// 获取选项值String name = cmd.getOptionValue("n");
} catch (ParseException e) {// 处理解析错误
}

4. 帮助信息

HelpFormatter 可以生成标准化的帮助信息:

HelpFormatter formatter = new HelpFormatter();
formatter.printHelp("greet", options, true);

输出示例:
在这里插入图片描述

五、实战案例

1. 文件处理工具

package org.hbin.cli;import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.DefaultParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;public class FileProcessor {public static void main(String[] args) {Options options = new Options();// 必选输入文件options.addOption(Option.builder("i").longOpt("input").required().hasArg().desc("输入文件路径(必选)").build());// 可选输出文件options.addOption(Option.builder("o").longOpt("output").hasArg().desc("输出文件路径").build());// 详细模式options.addOption("v", "verbose", false, "显示详细日志");CommandLineParser parser = new DefaultParser();HelpFormatter formatter = new HelpFormatter();try {CommandLine cmd = parser.parse(options, args);String inputFile = cmd.getOptionValue("i");System.out.println("处理文件: " + inputFile);if (cmd.hasOption("o")) {String outputFile = cmd.getOptionValue("o");System.out.println("输出到: " + outputFile);}if (cmd.hasOption("v")) {System.out.println("详细模式已启用");}// 实际文件处理逻辑...} catch (ParseException e) {System.err.println("错误: " + e.getMessage());formatter.printHelp("fileprocessor", options, true);System.exit(1);}}
}

在这里插入图片描述

在这里插入图片描述

2. 配置加载工具

package org.hbin.cli;import java.util.Properties;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.DefaultParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;public class ConfigLoader {public static void main(String[] args) {Options options = new Options();// 配置文件选项options.addOption("c", "config", true, "配置文件路径");// 多值系统属性options.addOption(Option.builder("D").hasArgs().valueSeparator().desc("系统属性,格式为-Dkey=value").build());try {CommandLine cmd = new DefaultParser().parse(options, args);if (cmd.hasOption("c")) {String configFile = cmd.getOptionValue("c");System.out.println("加载配置文件: " + configFile);}if (cmd.hasOption("D")) {Properties props = cmd.getOptionProperties("D");System.out.println("系统属性:");props.forEach((k, v) -> System.out.println("  " + k + " = " + v));}} catch (ParseException e) {new HelpFormatter().printHelp("configloader", options);System.exit(1);}}
}

在这里插入图片描述

在这里插入图片描述

六、最佳实践

  1. 必选参数检查:使用 required(true) 标记必选参数
  2. 友好的帮助信息:为每个选项提供清晰的描述
  3. 参数验证:解析后应对参数值进行额外验证
  4. 错误处理:捕获 ParseException 并提供有用的错误信息
  5. 代码组织:将选项定义、解析和处理逻辑分开

七、常见问题解答

Q1: 如何处理未知选项?

A: DefaultParser 默认会抛出 ParseException,你可以在 catch 块中处理这种情况。

Q2: 如何支持子命令?

A: Commons CLI 本身不直接支持子命令,但可以通过组合多个 Options 对象来实现类似功能。

Q3: 如何设置选项的默认值?

A: 可以在获取选项值时提供默认值:

String value = cmd.getOptionValue("option", "default");

Q4: 如何处理多个相同的选项?

A: 使用 getOptionValues() 方法:

String[] values = cmd.getOptionValues("option");

八、总结

通过本教程,你已经学会了:

  1. 如何在项目中引入 Commons CLI
  2. 如何定义各种类型的命令行选项
  3. 如何解析和处理命令行参数
  4. 如何生成标准化的帮助信息
  5. 几个实用的实战案例

Commons CLI 是 Java 开发命令行工具的利器,掌握它能让你快速构建出专业级的命令行应用。现在,尝试为你自己的项目添加命令行支持吧!

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

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

相关文章

VS2022调试嵌入式linux C# 程序 高效的开发方案

1.目标板子配置好ssh,确保PC可以连上 2.目标板子上传VSDBG程序&#xff0c;详见我的上一个文章 3.PC安装winfsp&#xff0c; sshfs,SSHFS-Win Manager.傻瓜式安装&#xff0c;将目标板子映射到PC的某个盘 4.VS2022中&#xff0c;你的工程的exe生成目录到上面盘中某个路径 5…

Python中如何加密/解密敏感信息(如用户密码、token)

敏感信息,如用户密码、API密钥、访问令牌(token)、信用卡号以及其他个人身份信息(PII),构成了现代应用程序和系统中最为关键的部分。这些信息一旦被未经授权的第三方获取,可能引发灾难性的后果,从个人隐私泄露到企业经济损失,甚至是大规模的社会安全问题。保护这些敏感…

智能体开发的范式革命:Cangjie Magic全景解读与实践思考

引言&#xff1a;当智能体开发遇见仓颉魔法 在人工智能技术日新月异的今天&#xff0c;智能体(Agent)开发正从实验室走向产业应用的核心舞台。2025年3月&#xff0c;仓颉社区推出的Cangjie Magic开源平台&#xff0c;以其创新的设计理念和技术架构&#xff0c;为这一领域带来了…

【Java学习笔记】位运算

位运算 一、原码&#xff0c;反码&#xff0c;补码 (1) 二进制的最高位是符号位&#xff1a;0 表示正数&#xff0c;1 表示负数&#xff08;怎么记&#xff1f; 1旋转一下变成-&#xff09; (2) 正数的原码、反码、补码都一样&#xff08;三码合一&#xff09; (3) 负数的反码…

HttpSessionBindingListener 的用法笔记250417

HttpSessionBindingListener 的用法笔记250417 HttpSessionBindingListener 是 Java Servlet 规范中 唯一 由 被存储对象自身实现 的会话监听接口&#xff0c; 1. 核心功能 HttpSessionBindingListener 是一个由 会话属性对象自身实现 的接口&#xff0c;用于监听该对象被绑定…

【HDFS入门】HDFS高可用性与容错机制深度解析

目录 引言 1 HDFS高可用架构实现 1.1 基于QJM的NameNode HA架构 1.2 QJM vs NFS实现对比 2 故障切换流程与ZooKeeper作用 2.1 自动故障转移流程 2.2 状态转换机制 3 数据恢复与副本管理 3.1 DataNode故障处理流程 4 快照与数据保护机制 4.1 HDFS快照架构 4.2 快照使…

04-libVLC的视频播放器:获取媒体信息

libvlc_media_t* libvlc_media_player_get_media(libvlc_media_player_t* p_mi); 功能说明 核心作用:获取与媒体播放器关联的当前媒体对象返回值:成功:返回libvlc_media_t*指针失败/无关联媒体:返回NULL内存管理:返回的媒体对象引用计数会增加,需要使用libvlc_media_rele…

使用datax通过HbaseShell封装writer和reader同步hbase数据到hbase_踩坑_细节总结---大数据之DataX工作笔记008

最近在做大数据相关功能,有个需求,使用datax同步hbase到hbase中,其中还是有很多细节值得记录: 首先来看一下datax的源码中,如果你使用phoenix创建的表,那么 你就需要使用对应的hbase带有sql字样的,reader和writer. 然后如果你使用datax-web来进行测试的,那么,他默认使用的是h…

如何通过window端来ssh连接本地虚拟机的ubuntu

首先在 Ubuntu 虚拟机上安装和配置 SSH 服务&#xff1a; # 安装 SSH 服务器 sudo apt update sudo apt install openssh-server# 检查 SSH 服务状态 sudo systemctl status ssh# 如果没有启动&#xff0c;则启动 SSH 服务 sudo systemctl start ssh# 设置开机自启动 sudo sys…

Anolis OS 8.10 发布:软硬协同优化,满足多行业实际应用需求

引言 龙蜥操作系统 Anolis OS 8 是 OpenAnolis 龙蜥社区发行的开源 Linux 发行版&#xff0c;支持多计算架构&#xff0c;提供稳定、高性能、安全、可靠的操作系统支持。Anolis OS 8.10 是 Anolis OS 8 发布的第六个小版本&#xff0c;通过软硬协同&#xff0c;不断完善生态&a…

Java八种常见的设计模式

一、单例模式 单例模式是&#xff08;Singleton Pattern&#xff09;Java中最常用的设计模式之一&#xff0c;它保证一个类仅有一个实例&#xff0c;并提供一个全局访问点。 实现单例模式的核心是将类的构造方法私有化&#xff0c;以防止外部直接通过构造函数创建实例。同时&am…

4.17---实现商铺和缓存与数据库双写一致以及宕机处理

实现商铺和缓存与数据库双写一致&#xff08;以及强双写一致策略&#xff09; redis点评项目采用的是延时双删策略 双删&#xff1a; 我们更新完数据库之后删除缓存&#xff0c;这样即使有线程并发进来查询&#xff0c;会发现缓存中没有数据&#xff0c;从而会去mysql中查找…

滑动窗口209. 长度最小的子数组

1.题目 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 示例 1&#xff1a; 输入&…

osu ai 论文笔记 DQN

e https://theses.liacs.nl/pdf/2019-2020-SteeJvander.pdf Creating an AI for the Rhytm Game osu! 20年的论文 用监督学习训练移动模型100首歌能达到95准确率 点击模型用DQN两千首歌65准确率 V抖用的居然不是强化学习&#xff1f; 5,6星打96准确度还是有的东西的 这是5.…

如何通过工具实现流程自动化

通过自动化工具&#xff0c;企业可以显著提高工作效率、降低人为错误、节省时间和成本。现代企业的运营中&#xff0c;流程管理是确保工作顺畅的关键&#xff0c;而人工处理繁琐的流程不仅容易出错&#xff0c;还会消耗大量的时间和人力资源。通过使用适合的自动化工具&#xf…

mongodb 4.0+多文档事务的实现原理

1. 副本集事务实现&#xff08;4.0&#xff09;‌ ‌非严格依赖二阶段提交‌ MongoDB 4.0 在副本集环境中通过 ‌全局逻辑时钟&#xff08;Logical Clock&#xff09;‌ 和 ‌快照隔离&#xff08;Snapshot Isolation&#xff09;‌ 实现多文档事务&#xff0c;事务提交时通过…

《理解 Java 泛型中的通配符:extends 与 super 的使用场景》

大家好呀&#xff01;&#x1f44b; 今天我们要聊一个让很多Java初学者头疼的话题——泛型通配符。别担心&#xff0c;我会用最通俗易懂的方式&#xff0c;带你彻底搞懂这个看似复杂的概念。准备好了吗&#xff1f;Let’s go! &#x1f680; 一、为什么我们需要泛型通配符&…

速盾:高防CDN访问多了会影响源站吗?

在当今数字化时代&#xff0c;内容分发网络&#xff08;CDN&#xff09;已经成为保障网站性能和用户体验的重要工具。特别是高防CDN&#xff0c;它不仅能够加速内容传输&#xff0c;还能有效抵御各种类型的网络攻击&#xff0c;确保业务的连续性和稳定性。然而&#xff0c;一些…

Unity URP Moblie AR示例工程,真机打包出来,没阴影

效果&#xff1a; unity ar示例演示 现象&#xff1a; 真机打包测试私活没有阴影 Unity版本&#xff1a;2022.3.4f1c1 分析原因&#xff1a; Prefab &#xff1a;ARFeatheredPlane中也有材质&#xff0c;一个用于环境遮挡&#xff0c;一个用于阴影接受。 按理说有啊。 urp …

win10下github libiec61850库编译调试sntp_example

libiec61850 https://github.com/mz-automation/libiec61850 v1.6 简介 libiec61850 是一个开源&#xff08;GPLv3&#xff09;的 IEC 61850 客户端和服务器库实现&#xff0c;支持 MMS、GOOSE 和 SV 协议。它使用 C 语言&#xff08;根据 C99 标准&#xff09;实现&#xf…