摘要:入門中把解釋參數分為三種狀態,分別是定義解釋和詢問交互。如果入參命令與實例對應不上就會拋出解析異常。查詢交互可以對入參命令進行判斷解析,例如可以查詢是否存在某個選項,以及獲取這個選項的值。
前言
以前寫過一些命令行程序,在需要帶參數的時候都是自己來判斷args,導致程序光解析args都占了好大一堆,而且解析代碼也不美觀。
偶然間發現了apache公共庫中的cli庫,在這里分享給大家。
commons-cli中把解釋參數分為三種狀態,分別是定義、解釋和詢問交互。
接下來,我以一個例子做一下說明:
maven庫:
commons-cli commons-cli 1.3.1
import org.apache.commons.cli.*; public class CLI { public static void main(String[] args) throws ParseException { //定義 Options options = new Options(); options.addOption("h",false,"list help");//false代表不強制有 options.addOption("t",true,"set time on system"); //解析 //1.3.1中已經棄用針對不同格式入參對應的解析器 //CommandLineParser parser = new PosixParser(); CommandLineParser parser = new DefaultParser(); CommandLine cmd = parser.parse(options,args); //查詢交互 //你的程序應當寫在這里,從這里啟動 if (cmd.hasOption("h")){ String formatstr = "CLI cli test"; HelpFormatter hf = new HelpFormatter(); hf.printHelp(formatstr, "", options, ""); return; } if (cmd.hasOption("t")){ System.out.printf("system time has setted %s ",cmd.getOptionValue("t")); return; } System.out.println("error"); } }
在另一個類中做一下測試
String argss[]={"-t 1000"}; CLI.main(argss);
結果是:
system time has setted 1000
String argss[]={"-h"}; CLI.main(argss);
結果是:
usage: CLI cli test
-h list help
-t
好啦,入門就到這里了。
代碼結構分析包組織結構:
commons-cli-1.3.1.jar
org.apache.commons.cli
在cli包中,包含了所有的類,包括定義,解析,查詢交互和Exception
類的關系結構圖如下
定義在定義這一部分,最重要的類是Option,Option類中定義了一個基本的選項,例如-t xxx ,是否為必選項,該命令的解釋等等。
Option重寫了很多構造函數,但是最終都調用下面這個構造函數:
public Option(String opt, String longOpt, boolean hasArg, String description) throws IllegalArgumentException { //寫這個代碼的人以前應該是寫C++的。。。 // 判斷短選項是否包含非法字符,如果包含拋出異常 OptionValidator.validateOption(opt); //短選項 this.opt = opt; //長選項 this.longOpt = longOpt; // 是否是必要選項 if (hasArg) { this.numberOfArgs = 1; } //選項描述 this.description = description; }
OptionsGroup類中包含了許多個Option,并可以對多個Option進行一些處理。其實現是采用一個HashMap來存儲Option的,key是Option中的長選項或者短選項的第一個字符,如果短選項存在,則優先選擇短選項。
OptionGroup類還包含了一個組描述和組是否必須存在,相當于對一群Option的群組操作。
Options類是被解析的對象,使用者可以在Options實例中直接添加命令,也可以添加Option實例,也可以添加OptionGroup實例。
其addOption方法最終調用了其重寫的一個方法:
public Options addOption(Option opt) { String key = opt.getKey(); // add it to the long option list if (opt.hasLongOpt()) { longOpts.put(opt.getLongOpt(), opt); } // if the option is required add it to the required list if (opt.isRequired()) { if (requiredOpts.contains(key)) { requiredOpts.remove(requiredOpts.indexOf(key)); } requiredOpts.add(key); } shortOpts.put(key, opt); return this; }
添加GroupOption方法如下:
public Options addOptionGroup(OptionGroup group) { if (group.isRequired()) { requiredOpts.add(group); } for (Option option : group.getOptions()) { // an Option cannot be required if it is in an // OptionGroup, either the group is required or // nothing is required option.setRequired(false); addOption(option); optionGroups.put(option.getKey(), group); } return this; }解析
接下來就是CommandLineParser接口,在1.3.1版本中取消了Parser抽象類,GnuParser、BasicParser、PosixParser類,取而代之的是DefaultParser類。DefaultParser類提供了對Options實例的解析,即對入參命令和Options實例之間對應關系的解析,返回的類是CommandLine。如果入參命令與Options實例對應不上就會拋出解析異常。
DefaultParser類解析方法最基本的方法是handleToken(String token),token是每一個入參字符串。這個方法會在解析錯誤的時候拋出解析異常。
查詢交互CommandLine可以對入參命令進行判斷解析,例如可以查詢是否存在某個選項,以及獲取這個選項的值。
總結cli包還是相當簡單的,大家也可以自己看一看commons庫的源碼。
更多文章:http://blog.gavinzh.com
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/65114.html
摘要:包執行時傳參的使用姿勢雖說我們現在大多不太直接使用包運行方式,目前比較主流的是將自己的服務丟在某個容器中如,等運行,比如我之前所屬的電商公司,就是將項目打包為包,丟到容器中運行的在使用時,可能會出現直接打包一個可執行的,然后運行,這種時候, showImg(https://segmentfault.com/img/remote/1460000015684728); jar包執行時傳參的...
摘要:經過年時間的發展,到目前為止,最新穩定版為版本。的發展剛出生的時候,引起了很多開源社區的關注,并且也有個人和企業開始嘗試使用。通過項目搭建過程來對比的差異和優勢。當然它的作用不僅于此,后續會逐步揭開它的真實面目。而和就相當于當年的和的關系。 要了解Spring Boot的發展背景,還得從2004年Spring ...
摘要:本文要來分享給大家程序員最常用的日志框架組件。沒有基礎的同學也不要著急,這套教程覆蓋了目前所有的日志框架,只要你學,就一定用得到,先收藏,以備不時之需。 作為一名Java程序員,我們開發了很多Java應用程序,包括桌面應用、WEB應用以及移動應用。然而日志系統是一個成熟Java應用所必不可少的。在開發和調試階段,日志可以幫...
摘要:五六月份推薦集合查看最新的請點擊集前端最近很火的框架資源定時更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥雀呼晴,侵曉窺檐語。葉上初陽乾宿雨,水面清圓,一一風荷舉。家住吳門,久作長安旅。五月漁郎相憶否。小楫輕舟,夢入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請::點擊::集web前端最近很火的vue2框架資源;定時更新,歡迎 Star 一下。 蘇...
閱讀 767·2021-10-09 09:58
閱讀 635·2021-08-27 16:24
閱讀 1719·2019-08-30 14:15
閱讀 2377·2019-08-30 11:04
閱讀 2061·2019-08-29 18:43
閱讀 2166·2019-08-29 15:20
閱讀 2712·2019-08-26 12:20
閱讀 1612·2019-08-26 11:44