Java利用Picocli開(kāi)發(fā)一個(gè)簡(jiǎn)化命令行工具
1、簡(jiǎn)述
Picocli 是一個(gè)強(qiáng)大、易用且功能豐富的 Java 庫(kù),用于開(kāi)發(fā)命令行工具。它支持多級(jí)子命令、類(lèi)型安全的參數(shù)解析和自動(dòng)生成幫助信息,同時(shí)具有較低的學(xué)習(xí)曲線(xiàn),是現(xiàn)代 CLI 應(yīng)用開(kāi)發(fā)的理想選擇。
2、為什么選擇 Picocli
簡(jiǎn)單易用:通過(guò)注解定義參數(shù),減少手動(dòng)解析邏輯。
強(qiáng)大功能:支持多種參數(shù)類(lèi)型、子命令和多線(xiàn)程執(zhí)行。
自動(dòng)化:內(nèi)置幫助信息和自動(dòng)補(bǔ)全功能。
活躍社區(qū):有詳細(xì)的文檔和大量實(shí)踐案例。
Picocli 的核心功能:
- 命令行參數(shù)解析:支持選項(xiàng)、位置參數(shù)、標(biāo)志。
- 多級(jí)子命令:輕松實(shí)現(xiàn)復(fù)雜的命令行結(jié)構(gòu)。
- 自動(dòng)生成幫助信息:無(wú)需手動(dòng)編寫(xiě)幫助文檔。
- 多線(xiàn)程支持:通過(guò) @CommandLine.Command 中的 ExecutionStrategy 輕松實(shí)現(xiàn)并發(fā)任務(wù)。
3、實(shí)踐樣例
以下是一個(gè)實(shí)踐案例,展示如何使用 Picocli 開(kāi)發(fā) CLI 工具,構(gòu)建一個(gè)簡(jiǎn)單的文件操作命令行工具:
3.1 添加依賴(lài)
在 Maven 項(xiàng)目中添加 Picocli 的依賴(lài):
<dependency> <groupId>info.picocli</groupId> <artifactId>picocli</artifactId> <version>4.7.4</version> </dependency>
3.2 構(gòu)建一個(gè)基本命令
下面創(chuàng)建一個(gè)簡(jiǎn)單的命令,支持對(duì)文件進(jìn)行讀取和統(tǒng)計(jì)操作。
import picocli.CommandLine; import picocli.CommandLine.Command; import picocli.CommandLine.Option; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.concurrent.Callable; @Command(name = "filetool", version = "FileTool 1.0", description = "一個(gè)用于文件操作的命令行工具", mixinStandardHelpOptions = true) public class FileTool implements Callable<Integer> { @Option(names = {"-p", "--path"}, description = "文件路徑", required = true) private String filePath; @Option(names = {"-c", "--count-lines"}, description = "統(tǒng)計(jì)文件行數(shù)") private boolean countLines; @Option(names = {"-r", "--read-content"}, description = "讀取并輸出文件內(nèi)容") private boolean readContent; @Override public Integer call() throws Exception { if (countLines) { long lineCount = Files.lines(Paths.get(filePath)).count(); System.out.println("文件行數(shù): " + lineCount); } if (readContent) { String content = new String(Files.readAllBytes(Paths.get(filePath))); System.out.println("文件內(nèi)容:\n" + content); } return 0; } public static void main(String[] args) { int exitCode = new CommandLine(new FileTool()).execute(args); System.exit(exitCode); } }
3.3 使用說(shuō)明
編譯并運(yùn)行程序后,可以通過(guò)以下方式使用該工具:
查看幫助信息:
java -jar filetool.jar --help
輸出示例:
用法: filetool [-hV] [-c] [-r] -p=<filePath>
一個(gè)用于文件操作的命令行工具
-c, --count-lines 統(tǒng)計(jì)文件行數(shù)
-h, --help 顯示幫助信息
-p, --path=<filePath> 文件路徑
-r, --read-content 讀取并輸出文件內(nèi)容
-V, --version 打印版本信息
統(tǒng)計(jì)文件行數(shù):
java -jar filetool.jar -p sample.txt -c
輸出示例:
文件行數(shù): 10
讀取文件內(nèi)容:
java -jar filetool.jar -p sample.txt -r
輸出示例:
文件內(nèi)容:
Hello World!
This is a test file.
4、高級(jí)功能示例
Picocli 支持子命令,可以用于實(shí)現(xiàn)復(fù)雜的 CLI 工具。以下是一個(gè)示例,構(gòu)建一個(gè)多功能工具,包含子命令 read 和 count:
@Command(name = "filetool", description = "文件工具", mixinStandardHelpOptions = true, subcommands = { FileReadCommand.class, FileCountCommand.class }) public class FileTool { public static void main(String[] args) { int exitCode = new CommandLine(new FileTool()).execute(args); System.exit(exitCode); } } @Command(name = "read", description = "讀取文件內(nèi)容") class FileReadCommand implements Callable<Integer> { @Option(names = {"-p", "--path"}, description = "文件路徑", required = true) private String filePath; @Override public Integer call() throws Exception { String content = new String(Files.readAllBytes(Paths.get(filePath))); System.out.println("文件內(nèi)容:\n" + content); return 0; } } @Command(name = "count", description = "統(tǒng)計(jì)文件行數(shù)") class FileCountCommand implements Callable<Integer> { @Option(names = {"-p", "--path"}, description = "文件路徑", required = true) private String filePath; @Override public Integer call() throws Exception { long lineCount = Files.lines(Paths.get(filePath)).count(); System.out.println("文件行數(shù): " + lineCount); return 0; } }
運(yùn)行示例:
查看幫助信息:
java -jar filetool.jar --help
使用子命令 read:
java -jar filetool.jar read -p sample.txt
使用子命令 count:
java -jar filetool.jar count -p sample.txt
5、總結(jié)
Picocli 是一個(gè)現(xiàn)代化的 Java 命令行工具開(kāi)發(fā)庫(kù),通過(guò)簡(jiǎn)單的注解和直觀的 API 提供強(qiáng)大的功能。無(wú)論是實(shí)現(xiàn)單一命令,還是構(gòu)建多級(jí)子命令的復(fù)雜工具,Picocli 都能快速滿(mǎn)足需求。
推薦的使用場(chǎng)景:
開(kāi)發(fā)運(yùn)維工具:如文件管理工具、數(shù)據(jù)處理工具。
數(shù)據(jù)分析腳本:支持多線(xiàn)程處理。
多子命令的框架型 CLI 工具。
到此這篇關(guān)于Java利用Picocli開(kāi)發(fā)一個(gè)簡(jiǎn)化命令行工具的文章就介紹到這了,更多相關(guān)Java Picocli簡(jiǎn)化命令行內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java基于logback?MessageConverter實(shí)現(xiàn)日志脫敏方案分析
本文介紹了一種日志脫敏方案,即基于logbackMessageConverter和正則匹配的方法,該方法的優(yōu)點(diǎn)是侵入性低,工作量少,只需修改xml配置文件,適用于老項(xiàng)目,感興趣的朋友跟隨小編一起看看吧2024-10-10Spring boot實(shí)現(xiàn)一個(gè)簡(jiǎn)單的ioc(2)
這篇文章主要為大家詳細(xì)介紹了Spring boot實(shí)現(xiàn)一個(gè)簡(jiǎn)單ioc的第二篇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04maven打生產(chǎn)環(huán)境可執(zhí)行包的實(shí)現(xiàn)
本文主要介紹了maven打生產(chǎn)環(huán)境可執(zhí)行包的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01解決springSecurity 使用默認(rèn)登陸界面登錄后無(wú)法跳轉(zhuǎn)問(wèn)題
這篇文章主要介紹了解決springSecurity 使用默認(rèn)登陸界面登錄后無(wú)法跳轉(zhuǎn)問(wèn)題,項(xiàng)目環(huán)境springboot下使用springSecurity 版本2.7.8,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2023-12-12mybatis實(shí)現(xiàn)圖書(shū)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了mybatis實(shí)現(xiàn)圖書(shū)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06win10安裝JDK14.0.2的詳細(xì)安裝過(guò)程
這篇文章主要介紹了win10安裝JDK14.0.2的詳細(xì)安裝過(guò)程的相關(guān)資料,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09