久久久噜噜噜久久熟女,久久久久久久久,国内精品,精品国产成人亚洲午夜福利,久久天堂av综合合色蜜桃网,好姑娘在线观看完整视频高清

首頁 > 時尚

使用 JCommander 解析命令行參數(shù)

來源:程序員客棧 時間:2023-06-23 12:45:24

前言

如果你想構(gòu)建一個支持命令行參數(shù)的程序,那么 jcommander 非常適合你,jcommander 是一個只有幾十 kb 的 Java 命令行參數(shù)解析工具,可以通過注解的方式快速實現(xiàn)命令行參數(shù)解析。


(相關(guān)資料圖)

這篇教程會通過介紹 jcommadner ,快速的創(chuàng)建一個命令行程序,最后支持的命令參數(shù)功能如下圖。

這個命令行工具仿照 git 操作命令,主要提供了如下功能命令:

1.?git-app.jar -help查看命令幫助信息。

2.?git-app.jar -version查看當前版本號。

3.?git-app.jar clone http://xxxx通過 URL 克隆一個倉庫。

4.?git-app.jar add file1 file2暫存 file1 文件 file2 文件。

5.?git-app.jar commit -m "注釋"提交并添加注釋。

jcommander 引入

截止文章編寫時間,最新版本如下:

com.beustjcommander1.82

jcommander 參數(shù)綁定

命令行解析中,參數(shù)解析與綁定是最實用的一個場景,jcommander 使用?Parameter注解進行參數(shù)綁定。我們定義一個?GitCommandOptions.java類來測試參數(shù)綁定。

package?com.wdbyte.jcommander.v1;import?com.beust.jcommander.Parameter;/**?*?@author?https://www.wdbyte.com?*/public?class?GitCommandOptions?{????@Parameter(names?=?{"clone"},????????description?=?"克隆遠程倉庫數(shù)據(jù)")????private?String?cloneUrl;????public?String?getCloneUrl()?{????????return?cloneUrl;????}}

使用 jcommander 結(jié)合 GitCommandOptions 來解析參數(shù)。

package?com.wdbyte.jcommander.v1;import?com.beust.jcommander.JCommander;/**?*?@author?https://www.wdbyte.com?*/public?class?GitApp?{????public?static?void?main(String[]?args)?{????????????//?args?=?new?String[]{"clone","http://www.wdbyte.com/test.git"};????????GitCommandOptions?gitCommandOptions?=?new?GitCommandOptions();????????JCommander?commander?=?JCommander.newBuilder()????????????.addObject(gitCommandOptions)????????????.build();????????commander.parse(args);????????System.out.println("clone?"?+?gitCommandOptions.getCloneUrl());????}}

打包后可以執(zhí)行命令參數(shù):

$?java?-jar?git-app.jar?clone?http://www.wdbyte.com/test.gitclone?http://www.wdbyte.com/test.git

這里是一個字符串參數(shù),需要在命令中輸出參數(shù)值,對于 boolean 類型的參數(shù),不需要傳值,有命令即為 true 值。

參數(shù)名稱

@Parameter注解中的?names屬性可以定義參數(shù)的名稱。且可以指定多個參數(shù)名稱,讓我再添加?version參數(shù)和?help參數(shù),同時設置參數(shù)別名。這兩個參數(shù)是 boolean 類型。

@Parameter(names?=?{"help",?"-help",?"-h"},????description?=?"查看幫助信息",????help?=?true)private?boolean?help;@Parameter(names?=?{"version",?"-version",?"-v"},????description?=?"顯示當前版本號")private?boolean?version?=?false;

參數(shù)限制

clone參數(shù)可以接受一個要克隆的 URL 鏈接,但是正常情況下只需要一個 URL 鏈接??梢酝ㄟ^?arity = 1進行限制。

@Parameter(names?=?{"clone"},????description?=?"克隆遠程倉庫數(shù)據(jù)",????arity?=?1)private?String?cloneUrl;

幫助信息

使用?usage()參數(shù)可以打印命令幫助信息。

GitCommandOptions?gitCommandOptions?=?new?GitCommandOptions();JCommander?commander?=?JCommander.newBuilder()????.addObject(gitCommandOptions)????.build();commander.parse(args);//?打印幫助信息commander.usage();

運行輸出幫助信息:

$?java?-jar?git-app.jarUsage:?[options]??Options:????clone??????克隆遠程倉庫數(shù)據(jù)????help,?-help,?-h??????查看幫助信息????version,?-version,?-v??????顯示當前版本號??????Default:?false

雖然正確的輸出了幫助信息,但是其中有?main class這段,是因為我們沒有指定項目名稱,我們指定項目名稱為?git-app。

JCommander?commander?=?JCommander.newBuilder()????????????.programName("git-app")????????????.addObject(gitCommandOptions)????????????.build();

參數(shù)排序

在幫助信息中,如果想要自定義參數(shù)順序,可以通過?order =?來排序,數(shù)字越小越靠前。

@Parameter(names?=?{"version",?"-version",?"-v"},????description?=?"顯示當前版本號",????order?=?2)private?boolean?version?=?false;

參數(shù)綁定完整測試

package?com.wdbyte.jcommander.v2;import?com.beust.jcommander.Parameter;/**?*?@author?https://www.wdbyte.com?*/public?class?GitCommandOptions?{????@Parameter(names?=?{"help",?"-help",?"-h"},????????description?=?"查看幫助信息",????????order?=?1,????????help?=?true)????private?boolean?help;????@Parameter(names?=?{"clone"},????????description?=?"克隆遠程倉庫數(shù)據(jù)",????????order?=?3,????????arity?=?1)????private?String?cloneUrl;????@Parameter(names?=?{"version",?"-version",?"-v"},????????description?=?"顯示當前版本號",????????order?=?2)????private?boolean?version?=?false;????//...get?method}

GitApp.java

package?com.wdbyte.jcommander.v2;import?com.beust.jcommander.JCommander;public?class?GitApp?{????public?static?void?main(String[]?args)?{????????GitCommandOptions?gitCommandOptions?=?new?GitCommandOptions();????????JCommander?commander?=?JCommander.newBuilder()????????????.programName("git-app")????????????.addObject(gitCommandOptions)????????????.build();????????commander.parse(args);????????//?打印幫助信息????????if?(gitCommandOptions.isHelp())?{????????????commander.usage();????????????return;????????}????????if?(gitCommandOptions.isVersion())?{????????????System.out.println("git?version?2.24.3?(Apple?Git-128)");????????????return;????????}????????if?(gitCommandOptions.getCloneUrl()?!=?null)?{????????????System.out.println("clone?"?+?gitCommandOptions.getCloneUrl());????????}????}}

運行測試:

jcommander 參數(shù)驗證

在上面的例子中, 假設 clone 命令傳入的參數(shù)必須是一個 URL,那么我們就要進行參數(shù)驗證,jcommander 也提供了特有的參數(shù)驗證方式。

1.?編寫參數(shù)驗證類,需要實現(xiàn)?IParameterValidator接口。

package?com.wdbyte.jcommander.v3;import?java.net.MalformedURLException;import?java.net.URL;import?com.beust.jcommander.IParameterValidator;import?com.beust.jcommander.ParameterException;/**?*?@author?https://www.wdbyte.com?*/public?class?UrlParameterValidator?implements?IParameterValidator?{????@Override????public?void?validate(String?key,?String?value)?throws?ParameterException?{????????try?{????????????new?URL(value);????????}?catch?(MalformedURLException?e)?{????????????throw?new?ParameterException("參數(shù)?"?+?key?+?"?的值必須是?URL?格式");????????}????}}

2.?clone參數(shù)指定驗證類。

@Parameter(names?=?{"clone"},????description?=?"克隆遠程倉庫數(shù)據(jù)",????validateWith?=?UrlParameterValidator.class,????order?=?3,????arity?=?1)private?String?cloneUrl;

運行測試:

$?java?-jar?git-app.jar?clone?https://www.wdbyte.com/test.gitclone?https://www.wdbyte.com/test.git$?java?-jar?git-app.jar?clone?test.gitException?in?thread?"main"?com.beust.jcommander.ParameterException:?參數(shù)?clone?的值必須是?URL?格式????at?com.wdbyte.jcommander.v3.UrlParameterValidator.validate(UrlParameterValidator.java:19)????at?com.beust.jcommander.ParameterDescription.validateParameter(ParameterDescription.java:377)????at?com.beust.jcommander.ParameterDescription.validateParameter(ParameterDescription.java:344)

jcommander 子命令

在使用 git 時,我們經(jīng)常會使用下面兩個命令。

1.?git add file1 file2暫存 file1 文件 file2 文件。

2.?git commit -m "注釋"提交并添加注釋。

什么是子命令

這是一種很常見的操作,git commit除了可以跟?-m子參數(shù)外,還可以跟各種參數(shù),通過 git 幫助文檔可以看到。

git?commit?[-a?|?--interactive?|?--patch]?[-s]?[-v]?[-u]?[--amend]???????????[--dry-run]?[(-c?|?-C?|?--fixup?|?--squash)?]???????????[-F?|?-m?]?[--reset-author]?[--allow-empty]???????????[--allow-empty-message]?[--no-verify]?[-e]?[--author=]???????????[--date=]?[--cleanup=]?[--[no-]status]???????????[-i?|?-o]?[-S[]]?[--]?[...]

這種有子參數(shù)的情況,我們可以稱?commit為 git 的一個子命令,使用 jcommander 如何配置子命令呢?

jcommander 子命令實現(xiàn)

我們新增子命令對應的參數(shù)類 GitCommandCommit.java.

package?com.wdbyte.jcommander;import?com.beust.jcommander.Parameter;import?com.beust.jcommander.Parameters;/**?*?git?commit?-m?"desc"?*?@author?https://www.wdbyte.com?*/@Parameters(commandDescription?=?"提交文件",?commandNames?=?"commit")public?class?GitCommandCommit?{??????public?static?final?String?COMMAND?=?"commit";??????@Parameter(names?=?{"-comment",?"-m"},????????description?=?"請輸入注釋",????????arity?=?1,????????required?=?true)????private?String?comment;????public?String?getComment()?{????????return?comment;????}}

代碼中使用?@Parameters注解指定了子命令為?commit,同時使用?@Paramete注解指定子參數(shù)?-m,同時?-m參數(shù)是必須的,使用屬性?required = true來指定。

使用 GitCommandCommit:

使用?addCommand添加?Commit命令參數(shù)類。

GitCommandOptions?gitCommandOptions?=?new?GitCommandOptions();GitCommandCommit?commandCommit?=?new?GitCommandCommit();JCommander?commander?=?JCommander.newBuilder()????.programName("git-app")????.addObject(gitCommandOptions)????.addCommand(commandCommit)????.build();commander.parse(args);String?parsedCommand?=?commander.getParsedCommand();if?("commit".equals(parsedCommand))?{????System.out.println(commandCommit.getComment());}

運行測試:

$?java?-jar?git-app.jar?commit?-m?"注釋一下"注釋一下

同上,我們可以添加?add命令對應的參數(shù)類:GitCommandAdd.java. 這次我們定義一個 List 類型參數(shù),但是不在屬性上指定子參數(shù)名稱。

package?com.wdbyte.jcommander.v5;import?java.util.List;import?com.beust.jcommander.Parameter;import?com.beust.jcommander.Parameters;/**?*?git?add?file1?file2?*?*?@author?https://www.wdbyte.com?*/@Parameters(commandDescription?=?"暫存文件",?commandNames?=?"add",?separators?=?"?")public?class?GitCommandAdd?{????public?static?final?String?COMMAND?=?"add";????@Parameter(description?=?"暫存文件列表")????private?Listfiles;????public?ListgetFiles()?{????????return?files;????}}

同樣添加到子命令:

JCommander?commander?=?JCommander.newBuilder()????.programName("git-app")????.addObject(gitCommandOptions)????.addCommand(commandCommit)????.addCommand(commandAdd)????.build();commander.parse(args);if?("add".equals(parsedCommand))?{????for?(String?file?:?commandAdd.getFiles())?{????????System.out.println("暫存文件:"?+?file);????}}

運行測試:

$?java?-jar?git-app.jar?add?file1.txt?file2.txt暫存文件:file1.txt暫存文件:file2.txt

jcommander 參數(shù)轉(zhuǎn)換

在上面的?GitCommandAdd代碼中,add命令傳入的都是文件路徑,現(xiàn)在是使用?List來接收入?yún)?,通常情況想我們可能需要直接轉(zhuǎn)換成方便操作的類型,如 File 或者 Path,這該如何方面的轉(zhuǎn)換呢,jcommander 也提供了方便轉(zhuǎn)換類。

首先編寫一個轉(zhuǎn)換類 FilePathConverter 用于把入?yún)⑥D(zhuǎn)換成 Path 類,同時校驗文件是否存在

package?com.wdbyte.jcommander;import?java.nio.file.Files;import?java.nio.file.Path;import?java.nio.file.Paths;import?com.beust.jcommander.IStringConverter;import?com.beust.jcommander.ParameterException;/**?*?*?@author?https://www.wdbyte.com?*/public?class?FilePathConverter?implements?IStringConverter{????@Override????public?Path?convert(String?filePath)?{????????Path?path?=?Paths.get(filePath);????????if?(Files.exists(path))?{????????????return?path;????????}????????throw?new?ParameterException(String.format("文件不存在,path:%s",?filePath));????}}

通過注解指定轉(zhuǎn)換類:

@Parameter(description?=?"暫存文件列表",?converter?=?FilePathConverter.class)private?Listfiles;

打包測試:

$?java?-jar?git-app.jar?add?file1?file2文件不存在,path:file1$?ls?-ltotal?12448drwxr-xr-x??2?darcy??staff????64B??6?15?21:10?archive-tmpdrwxr-xr-x??3?darcy??staff????96B??6?15?21:10?classesdrwxr-xr-x??3?darcy??staff????96B??6?15?21:10?generated-sources-rw-r--r--??1?darcy??staff???5.6M??6?16?20:44?git-app.jar$?git-app.jar?git-app.jar暫存文件:git-app.jar

總體測試

一如既往,文章代碼都存放在?Github.com/niumoo/javaNotes.

參考:https://jcommander.org/

相關(guān)稿件

使用 JCommander 解析命令行參數(shù)

肯揚馬丁之子_基斯肯揚馬丁

【網(wǎng)絡中國節(jié)·端午】柳林:粽香迎端午 共話雙擁情

濃情端午 粽兒飄香——興縣振興社區(qū)開展端午節(jié)親子主題活動

神鳥展翅!成都這座民航大樓拔地而起

湖北教育新聞|湖北美術(shù)學院舉行2023屆畢業(yè)典禮暨學位授予儀式|熱消息

22項活動全部免費!青山區(qū)青少年夏令營今天開始注冊

因地制宜推進生態(tài)產(chǎn)品價值實現(xiàn)|天天熱門

天天快播:2023江西高考分數(shù)線出爐:文科一本533分,理科一本518分

電力“及時雨” 全力抗旱保民生-環(huán)球今頭條

全球觀焦點:【沉醉·鄭州仲夏夜】系列報道:這個夏天,總要來鄭州街頭走一走

二手房個稅和契稅怎么算_二手房個稅

2023年06月22-23日云南省部分風景區(qū)天氣預報|當前快看

長三角鐵路客流保持高位運行

難怪我不愛吃胡蘿卜,它和香菜是一家的!-今日播報

蘋果 iPhone 新專利獲批:音量鍵等采用固態(tài)按鈕

三大特攝端午節(jié)賀圖匯總,除了假面騎士都是Q版的_焦點要聞

四月沙雕番公主連接第1話:蘿莉當親媽男主教你新手教程如何翻車 當前熱門

每日熱點:數(shù)碼寶貝:技術(shù)帝自改超酷炫電光暴龍獸模型有望成新作究極體

世界最新:比利時王后和荷蘭王后頭頂王冠赴宴,倆高知女性聊個不停,國王都無奈了

天天報道:英國民眾苦通脹“高燒不退” 政府難有良策失民心

【快播報】沙雅縣35萬畝小麥開鐮收割

csgo進不去游戲直接彈回桌面_csgo進不去游戲-世界百事通

全球今日報丨比特率是什么意思?_比特率

環(huán)球通訊!景德鎮(zhèn)陶瓷市場分析_景德鎮(zhèn)陶瓷市場

【全球時快訊】互聯(lián)網(wǎng)大廠的裁員自救之路

十二星座當中,誰就算不會唱歌也要當麥霸,你遇到過嗎?|世界百事通

焦點熱議:土壤污染治理上市公司龍頭股票有哪些?這些股票值得愛嗎?(2023/6/23)

2023年電子競技龍頭股票一覽表(6月23日)

物理學學什么課程及畢業(yè)薪酬崗位去向 就業(yè)前景怎么樣|前沿資訊