亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

red_bricks / 3205人閱讀

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

jar包執(zhí)行時(shí)傳參的使用姿勢(shì)

雖說(shuō)我們現(xiàn)在大多不太直接使用jar包運(yùn)行方式,目前比較主流的是將自己的服務(wù)丟在某個(gè)容器中(如tomcat,jetty等)運(yùn)行,比如我之前所屬的電商公司,就是將項(xiàng)目打包為war包,丟到tomcat容器中運(yùn)行的

在使用SpringBoot時(shí),可能會(huì)出現(xiàn)直接打包一個(gè)可執(zhí)行的jar,然后運(yùn)行,這種時(shí)候,通過(guò)java命令執(zhí)行時(shí),時(shí)可以傳參的,那么問(wèn)題來(lái)了,main方法可以如何優(yōu)雅的解析這些傳參呢?

I. 簡(jiǎn)陋版本

最容易想到的,無(wú)非是自己直接解析main方法的傳參,如我們知道的main方法的一般寫法為

public static void main(String[] args) {
}

看到上面的寫法,很容易就可以猜到,傳入的參數(shù)最終都放到了args數(shù)組中,那么該怎么用就怎么用,一個(gè)hello world的實(shí)例如下

public static void main(String[] args) {
    System.out.println("hello " + args[0]);
}

測(cè)試如下:

看到這里,真心感覺沒有什么干貨,上面這些過(guò)于小白了吧,估計(jì)連入門都算不上,那么參數(shù)處理僅止于此么?

II. 進(jìn)階版本

玩過(guò)shell的同學(xué)應(yīng)該都知道m(xù)an命令,可以用來(lái)查看很多shell命令的幫助,里面介紹了很多的shell命令的參數(shù)說(shuō)明,而且這些參數(shù)一般有縮寫和全拼,而且有些參數(shù)可以帶傳值,有些并不需要,可以說(shuō)shell命令的傳參方式,已經(jīng)擁有自己獨(dú)立的一套規(guī)范了,而且用起來(lái)非常的爽

那么我們的jar包,能否支持這種傳參方式呢?

舉一個(gè)簡(jiǎn)單的例子,上面的HelloWord接收一個(gè)簡(jiǎn)單用戶名參數(shù)

不傳入時(shí),默認(rèn)輸出 hello world

短參方式: -n xxx

長(zhǎng)參方式: --name=xxx

僅僅支持這一個(gè)場(chǎng)景,需要自己來(lái)解析的話,就得寫一長(zhǎng)串的代碼,好在這種需求已經(jīng)有輪子了

1. commons-cli

首先引入依賴


    commons-cli
    commons-cli
    1.3.1

開始使用,官網(wǎng)已經(jīng)給出了例子,完整的doc可以參考

commons-cli Usage Scenarios

2. 實(shí)例演示

下面結(jié)合我的一個(gè)項(xiàng)目,給出實(shí)際的使用方式

@Slf4j
public class AppLaunch {
    private static final String SOURCE_PATH = "./task-core/src/test/java/com/git/hui/task";
    private static final String TASK_ARG_LONG = "task";
    private static final String TASK_ARG_SHORT = "t";
    private static final String ARG_HELP_LONG = "help";
    private static final String ARG_HELP_SHORT = "h";
    private static volatile boolean run = true;


    private static void printHelp() {
        Options options = buildOptions();
        HelpFormatter helpFormatter = new HelpFormatter();
        helpFormatter.printHelp("java -jar ${jar} [options]", options);
    }

    private static Options buildOptions() {
        Options options = new Options();
        options.addOption(
                Option.builder(TASK_ARG_SHORT).argName(TASK_ARG_LONG).hasArg().longOpt(TASK_ARG_LONG).required(false)
                        .desc("choose task path, default [" + SOURCE_PATH + "]").build());
        options.addOption(Option.builder(ARG_HELP_SHORT).longOpt(ARG_HELP_LONG).desc("show command help").build());
        return options;
    }

    private static CommandLine parseArguments(String[] arguments) {
        Options options = buildOptions();
        CommandLine commandLine = null;
        try {
            commandLine = new DefaultParser().parse(options, arguments);
        } catch (ParseException e) {
            e.printStackTrace();
            System.exit(1);
        }

        if (commandLine.hasOption(ARG_HELP_LONG)) {
            printHelp();
            System.exit(0);
        }
        return commandLine;
    }


    public static void main(String[] args) throws InterruptedException {
        CommandLine commandLine = parseArguments(args);
        String scriptSource = commandLine.getOptionValue(TASK_ARG_LONG, SOURCE_PATH);
        System.out.println("script source: {}" + scriptSource);
        // ....
    }
}

對(duì)上面的使用姿勢(shì)進(jìn)行簡(jiǎn)單的說(shuō)明,從邏輯上劃分,可以分為下面幾塊

定義傳參,包括參數(shù)說(shuō)明,縮寫和全拼,是否有參數(shù)值,描述等

解析傳參數(shù)組,將具體的傳參解析為CommandLine對(duì)象

獲取參數(shù),執(zhí)行相應(yīng)的業(yè)務(wù)邏輯

從源碼角度來(lái)看,沒什么復(fù)雜或者難以理解的地方,稍稍提一點(diǎn),參數(shù)的定義,即buildOption方法中,上面指定了兩個(gè)參數(shù) help, task, 其中一個(gè)要求有參數(shù)值,一個(gè)不需要參數(shù)值,下面實(shí)際演示如下

III. 其他 0. 相關(guān)信息

文檔: commons-cli 使用手冊(cè)

實(shí)際項(xiàng)目:https://github.com/liuyueyi/quick-task

1. 一灰灰Blog: https://liuyueyi.github.io/he...

一灰灰的個(gè)人博客,記錄所有學(xué)習(xí)和工作中的博文,歡迎大家前去逛逛

2. 聲明

盡信書則不如,已上內(nèi)容,純屬一家之言,因個(gè)人能力有限,難免有疏漏和錯(cuò)誤之處,如發(fā)現(xiàn)bug或者有更好的建議,歡迎批評(píng)指正,不吝感激

微博地址: 小灰灰Blog

QQ: 一灰灰/3302797840

3. 掃描關(guān)注

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

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

相關(guān)文章

  • 小程序?qū)嵺`小坑小結(jié)(一)

    摘要:最近自己在做小程序練習(xí),分享一下我遇到的小坑數(shù)據(jù)更新直接對(duì)進(jìn)行賦值,是無(wú)法更新視圖綁定的數(shù)據(jù)的,會(huì)造成數(shù)據(jù)不一致需要使用更新暫時(shí)不支持絕對(duì)路徑不能使用靜態(tài)文件,只能使用和網(wǎng)絡(luò)圖片可以用 最近自己在做小程序練習(xí),分享一下我遇到的小坑 data數(shù)據(jù)更新 直接對(duì)this.data進(jìn)行賦值,是無(wú)法更新視圖綁定的數(shù)據(jù)的,會(huì)造成數(shù)據(jù)不一致 需要使用this.setData更新 this.dat...

    tianhang 評(píng)論0 收藏0
  • Sass 語(yǔ)法小結(jié)

    摘要:本文主要對(duì)的基本語(yǔ)法進(jìn)行了小結(jié),方便日后快速查閱使用。另外,因?yàn)榈恼Z(yǔ)法完全兼容,所以可以把原始的文件改名為后綴,即可直接導(dǎo)入了。為了解決這個(gè)問(wèn)題,允許通過(guò)語(yǔ)法的形式指定每個(gè)參數(shù)的值。后記功能豐富強(qiáng)大,上面的語(yǔ)法小結(jié)只是其中的一小部分。 本文主要對(duì) Sass 的基本語(yǔ)法進(jìn)行了小結(jié),方便日后快速查閱使用。 一、變量($) 1. 變量標(biāo)識(shí)符 Sass 使用 $ 符號(hào)來(lái)標(biāo)識(shí)變量。 $highl...

    lidashuang 評(píng)論0 收藏0
  • 面試小結(jié)(一)

    摘要:面試問(wèn)到的問(wèn)題繼承的幾種方法,,原形繼承面向?qū)ο蟮膸追N方法五種方式對(duì)象字面量創(chuàng)建實(shí)例對(duì)象構(gòu)造函數(shù)工廠模式用一個(gè)函數(shù),通過(guò)傳遞參數(shù)返回對(duì)象。打包原理打包原理把所有依賴打包成一個(gè)文件,通過(guò)代碼分割成單元片段并按需加載。 面試問(wèn)到的問(wèn)題:1、繼承的幾種方法; Call,apply,原形繼承; 2、面向?qū)ο蟮膸追N方法; 五種方式: 1)對(duì)象字面量:var obj={}; 2)創(chuàng)建實(shí)例對(duì)象:va...

    xiaodao 評(píng)論0 收藏0
  • 面試小結(jié)(一)

    摘要:面試問(wèn)到的問(wèn)題繼承的幾種方法,,原形繼承面向?qū)ο蟮膸追N方法五種方式對(duì)象字面量創(chuàng)建實(shí)例對(duì)象構(gòu)造函數(shù)工廠模式用一個(gè)函數(shù),通過(guò)傳遞參數(shù)返回對(duì)象。打包原理打包原理把所有依賴打包成一個(gè)文件,通過(guò)代碼分割成單元片段并按需加載。 面試問(wèn)到的問(wèn)題:1、繼承的幾種方法; Call,apply,原形繼承; 2、面向?qū)ο蟮膸追N方法; 五種方式: 1)對(duì)象字面量:var obj={}; 2)創(chuàng)建實(shí)例對(duì)象:va...

    SnaiLiu 評(píng)論0 收藏0
  • 面試小結(jié)(一)

    摘要:面試問(wèn)到的問(wèn)題繼承的幾種方法,,原形繼承面向?qū)ο蟮膸追N方法五種方式對(duì)象字面量創(chuàng)建實(shí)例對(duì)象構(gòu)造函數(shù)工廠模式用一個(gè)函數(shù),通過(guò)傳遞參數(shù)返回對(duì)象。打包原理打包原理把所有依賴打包成一個(gè)文件,通過(guò)代碼分割成單元片段并按需加載。 面試問(wèn)到的問(wèn)題:1、繼承的幾種方法; Call,apply,原形繼承; 2、面向?qū)ο蟮膸追N方法; 五種方式: 1)對(duì)象字面量:var obj={}; 2)創(chuàng)建實(shí)例對(duì)象:va...

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

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

0條評(píng)論

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