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.pswp.cn/bicheng/77295.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77295.shtml
英文地址,請注明出處:http://en.pswp.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…