成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Commons CLI 入門及代碼簡(jiǎn)單分析

Apollo / 2548人閱讀

摘要:入門中把解釋參數(shù)分為三種狀態(tài),分別是定義解釋和詢問交互。如果入?yún)⒚钆c實(shí)例對(duì)應(yīng)不上就會(huì)拋出解析異常。查詢交互可以對(duì)入?yún)⒚钸M(jìn)行判斷解析,例如可以查詢是否存在某個(gè)選項(xiàng),以及獲取這個(gè)選項(xiàng)的值。

前言

以前寫過一些命令行程序,在需要帶參數(shù)的時(shí)候都是自己來判斷args,導(dǎo)致程序光解析args都占了好大一堆,而且解析代碼也不美觀。
偶然間發(fā)現(xiàn)了apache公共庫(kù)中的cli庫(kù),在這里分享給大家。

入門

commons-cli中把解釋參數(shù)分為三種狀態(tài),分別是定義、解釋和詢問交互。

接下來,我以一個(gè)例子做一下說明:

maven庫(kù):


        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代表不強(qiáng)制有
        options.addOption("t",true,"set time on system");

        //解析
        //1.3.1中已經(jīng)棄用針對(duì)不同格式入?yún)?duì)應(yīng)的解析器
        //CommandLineParser parser = new PosixParser();
        CommandLineParser parser = new DefaultParser();
        CommandLine cmd = parser.parse(options,args);

        //查詢交互
        //你的程序應(yīng)當(dāng)寫在這里,從這里啟動(dòng)
        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");
    }
}

在另一個(gè)類中做一下測(cè)試

String argss[]={"-t  1000"};
CLI.main(argss);

結(jié)果是:

system time has setted 1000

String argss[]={"-h"};
CLI.main(argss);

結(jié)果是:

usage: CLI cli test
-h list help
-t set time on system

好啦,入門就到這里了。

代碼結(jié)構(gòu)分析

包組織結(jié)構(gòu):

commons-cli-1.3.1.jar
org.apache.commons.cli

在cli包中,包含了所有的類,包括定義,解析,查詢交互和Exception

類的關(guān)系結(jié)構(gòu)圖如下

定義

在定義這一部分,最重要的類是Option,Option類中定義了一個(gè)基本的選項(xiàng),例如-t xxx ,是否為必選項(xiàng),該命令的解釋等等。

Option重寫了很多構(gòu)造函數(shù),但是最終都調(diào)用下面這個(gè)構(gòu)造函數(shù):

public Option(String opt, String longOpt, boolean hasArg, String description)
           throws IllegalArgumentException
    {
        //寫這個(gè)代碼的人以前應(yīng)該是寫C++的。。。
        // 判斷短選項(xiàng)是否包含非法字符,如果包含拋出異常
        OptionValidator.validateOption(opt);
        //短選項(xiàng)
        this.opt = opt;
        //長(zhǎng)選項(xiàng)
        this.longOpt = longOpt;

        // 是否是必要選項(xiàng)
        if (hasArg)
        {
            this.numberOfArgs = 1;
        }
        //選項(xiàng)描述
        this.description = description;
    }

OptionsGroup類中包含了許多個(gè)Option,并可以對(duì)多個(gè)Option進(jìn)行一些處理。其實(shí)現(xiàn)是采用一個(gè)HashMap來存儲(chǔ)Option的,key是Option中的長(zhǎng)選項(xiàng)或者短選項(xiàng)的第一個(gè)字符,如果短選項(xiàng)存在,則優(yōu)先選擇短選項(xiàng)。

OptionGroup類還包含了一個(gè)組描述和組是否必須存在,相當(dāng)于對(duì)一群Option的群組操作。

Options類是被解析的對(duì)象,使用者可以在Options實(shí)例中直接添加命令,也可以添加Option實(shí)例,也可以添加OptionGroup實(shí)例。

其addOption方法最終調(diào)用了其重寫的一個(gè)方法:

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類提供了對(duì)Options實(shí)例的解析,即對(duì)入?yún)⒚詈蚈ptions實(shí)例之間對(duì)應(yīng)關(guān)系的解析,返回的類是CommandLine。如果入?yún)⒚钆cOptions實(shí)例對(duì)應(yīng)不上就會(huì)拋出解析異常。

DefaultParser類解析方法最基本的方法是handleToken(String token),token是每一個(gè)入?yún)⒆址?。這個(gè)方法會(huì)在解析錯(cuò)誤的時(shí)候拋出解析異常。

查詢交互

CommandLine可以對(duì)入?yún)⒚钸M(jìn)行判斷解析,例如可以查詢是否存在某個(gè)選項(xiàng),以及獲取這個(gè)選項(xiàng)的值。

總結(jié)

cli包還是相當(dāng)簡(jiǎn)單的,大家也可以自己看一看commons庫(kù)的源碼。

更多文章:http://blog.gavinzh.com

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/65114.html

相關(guān)文章

  • 180718-jar包執(zhí)行傳參使用小結(jié)

    摘要:包執(zhí)行時(shí)傳參的使用姿勢(shì)雖說我們現(xiàn)在大多不太直接使用包運(yùn)行方式,目前比較主流的是將自己的服務(wù)丟在某個(gè)容器中如,等運(yùn)行,比如我之前所屬的電商公司,就是將項(xiàng)目打包為包,丟到容器中運(yùn)行的在使用時(shí),可能會(huì)出現(xiàn)直接打包一個(gè)可執(zhí)行的,然后運(yùn)行,這種時(shí)候, showImg(https://segmentfault.com/img/remote/1460000015684728); jar包執(zhí)行時(shí)傳參的...

    red_bricks 評(píng)論0 收藏0
  • #yyds干貨盤點(diǎn)# Spring Boot的前世今生以它和Spring Cloud的關(guān)系詳解。

    摘要:經(jīng)過年時(shí)間的發(fā)展,到目前為止,最新穩(wěn)定版為版本。的發(fā)展剛出生的時(shí)候,引起了很多開源社區(qū)的關(guān)注,并且也有個(gè)人和企業(yè)開始嘗試使用。通過項(xiàng)目搭建過程來對(duì)比的差異和優(yōu)勢(shì)。當(dāng)然它的作用不僅于此,后續(xù)會(huì)逐步揭開它的真實(shí)面目。而和就相當(dāng)于當(dāng)年的和的關(guān)系。 要了解Spring Boot的發(fā)展背景,還得從2004年Spring ...

    番茄西紅柿 評(píng)論0 收藏2637
  • 強(qiáng)推!大牛程序員必備的Java日志框架,性能無敵

    摘要:本文要來分享給大家程序員最常用的日志框架組件。沒有基礎(chǔ)的同學(xué)也不要著急,這套教程覆蓋了目前所有的日志框架,只要你學(xué),就一定用得到,先收藏,以備不時(shí)之需。 作為一名Java程序員,我們開發(fā)了很多Java應(yīng)用程序,包括桌面應(yīng)用、WEB應(yīng)用以及移動(dòng)應(yīng)用。然而日志系統(tǒng)是一個(gè)成熟Java應(yīng)用所必不可少的。在開發(fā)和調(diào)試階段,日志可以幫...

    zebrayoung 評(píng)論0 收藏0
  • 關(guān)于Vue2一些值得推薦的文章 -- 五、六月份

    摘要:五六月份推薦集合查看最新的請(qǐng)點(diǎn)擊集前端最近很火的框架資源定時(shí)更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥雀呼晴,侵曉窺檐語(yǔ)。葉上初陽(yáng)乾宿雨,水面清圓,一一風(fēng)荷舉。家住吳門,久作長(zhǎng)安旅。五月漁郎相憶否。小楫輕舟,夢(mèng)入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請(qǐng)::點(diǎn)擊::集web前端最近很火的vue2框架資源;定時(shí)更新,歡迎 Star 一下。 蘇...

    sutaking 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<