精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

怎么基于Java編寫一個CLI工具?

開發 前端
總的來說,Apache Commons CLI是一個非常強大的工具,可以幫助你輕松地處理命令行參數。無論你的應用程序需要處理多少個參數,或者這些參數的類型是什么, Commons CLI都可以提供幫助。

CLI

CLI,全稱為命令行界面(Command Line Interface),是一種用于通過鍵盤輸入指令與操作系統進行交互的軟件機制。這種界面是在圖形用戶界面得到普及之前使用最為廣泛的用戶界面,并且, 即使在當前圖形用戶界面廣泛使用的環境下,CLI仍然有其獨特的優勢和廣泛的應用。

對于CLI,它的一個重要特性就是效率。用戶可以在一條文本命令中對多個文件執行操作,而不需要在各個窗口之間切換,節省了大量時間。此外,如果你已經熟悉了這些命令,那么你可以非常快速地瀏覽系統并與之交互。

構建CLI的工具很多,今天主要基于Java語言來實現,其中Apache Commons CLI框架提供了這樣的便利。今天結合之前學習的graalVM提供的native-image工具,來生成一個exe類型的可執行文件,由于graalVM的跨平臺性,我們還能生成各個平臺的CLI命令來輔助完成更多的工作。

Apache Commons CLI是一個用于編寫命令行界面的Java庫。它提供了一個靈活的框架,可以很容易地定義和解析命令行參數。這個庫的主要優點是它可以處理各種類型的參數,包括選項、位置參數、可選參數等。

構成

下面以native-image為例,通過在終端輸入native-image --help可以看到以下信息

_> native-image --help

GraalVM Native Image (https://www.graalvm.org/native-image/)

This tool can ahead-of-time compile Java code to native executables.

Usage: native-image [options] class [imagename] [options]
           (to build an image for a class)
   or  native-image [options] -jar jarfile [imagename] [options]
           (to build an image for a jar file)
   or  native-image [options] -m <module>[/<mainclass>] [options]
       native-image [options] --module <module>[/<mainclass>] [options]
           (to build an image for a module)

where options include:

    @argument files       one or more argument files containing options
    -cp <class search path of directories and zip/jar files>
    -classpath <class search path of directories and zip/jar files>
    --class-path <class search path of directories and zip/jar files>
                          A ; separated list of directories, JAR archives,
                          and ZIP archives to search for class files.
    -p <module path>
    --module-path <module path>...
                          A ; separated list of directories, each directory
                          is a directory of modules.

一個合格的CLI基本都會提供help選項來展示,這個CLI的語法、選項以及功能描述。從上面的輸出可以看到help主要包括:

  1. 介紹:主要對命令的功能的描述,包括官網、版本以及一些內在系數等
  2. 用法:包括命令語法格式、配置項、參數等信息
  3. 參數說明:具體配置項參數的說明,以及具體的功能描述

Common-CLI

  • 定義階段:在Java代碼中定義Option參數,定義參數、是否需要輸入值、簡單的描述等
  • 解析階段:應用程序傳入參數后,CLI進行解析
  • 詢問階段:通過查詢CommandLine詢問進入到哪個程序分支中

定義階段

主要是借助Option類提供的API來構建各種選項以及參數信息,下面是對應API的描述:

返回值

方法名

說明

Options

addOption(Option opt)

添加一個選項實例

Options

addOption(String opt, boolean hasArg, String description)

添加一個只包含短名稱的選項

Options

addOption(String opt, String description)

添加一個只包含短名稱的選項

Options

addOption(String opt, String longOpt, boolean hasArg, String description)

添加一個包含短名稱和長名稱的選項

Options

addOptionGroup(OptionGroup group)

添加一個選項組

List

getMatchingOptions(String opt)

獲得匹配選項的長名稱集合

Option

getOption(String opt)

通過長名稱或短名稱獲得選項

OptionGroup

getOptionGroup(Option opt)

獲得選項所在的選項組

Collection

getOptions()

獲得一個只讀的選項集合

List

getRequiredOptions()

獲得必須的選項集合

boolean

hasLongOption(String opt)

判斷是否存在選項

boolean

hasOption(String opt)

判斷是否存在選項

boolean

hasShortOption(String opt)

判斷是否存在選項

解析階段

主要對輸入參數的解析,也就是main方法的參數,默認提供下面3中語法解析的支持:

  • DefaultParser:提供了基礎的解析功能,能解析簡單的命令行參數。(比如:java -Djava.awt.headless=true -Djava.net.useSystemProxies=true Foo)
  • PosixParser:提供了解析POSIX形式參數的功能。(比如:tar -zxvf foo.tar.gz)
  • GnuParser:提供了解析長參數及Java命令中參數的功能。(比如:du --human-readable --max-depth=1)

詢問階段

基于上一步解析后,會將參數解析成CommandLine,結合Option中的配置,需要我們完成各種配置、參數匹配后的業務處理流程,類型下面這樣:

if( commandLine.hasOption("help") ){
          helper.printHelp("calendar [options] \n\nwhere options include:", null, options, null, false);
          return;
      }

      if( commandLine.hasOption("version") ){
          printResult("1.0.0");
          return;
      }

解析的過程有時候會比較些復雜,示例中是針對單一選項的分支,當多個選項混合使用時,比如tar -zxvf xxx.tar.gz這樣的,當然前提是我們定義的CLI支持這種風格。

示例

下面通過一個簡單的示例看下如何構建一個CLI的工具:該示例的作用是按指定格式輸出當前日期:

clendar -o yyyy-MM-dd
  • 定義配置項
private static Options initOptions() {
        Options options = new Options();

        options.addOption(Option.builder("H")
                .longOpt("help")
                .desc("show help information").build());

        options.addOption(Option.builder("V")
                .longOpt("version")
                .desc("show help information").build());

        options.addOption(Option.builder("O")
                .longOpt("out")
                .hasArg(true)
                .argName("fmt") // 只是定義
                .required(false)
                .desc("configure the date output format").build());

        return options;
    }
  • 解析參數
private static CommandLine parseArguments(Options options, String[] args){
        CommandLineParser parser = new DefaultParser();

        try {
            return parser.parse(options, args);
        } catch (ParseException e) {
            System.err.println(e.getMessage());
        }
        return null;
    }
  • 詢問階段
private static void handleCommand(Options options, CommandLine commandLine) {
        if(ArrayUtils.isEmpty(commandLine.getOptions()) ){
            printResult("Please specify options for calendar building or use --help for more info.");
            return;
        }

        if( commandLine.hasOption("help") ){
            helper.printHelp("calendar [options] \n\nwhere options include:", null, options, null, false);
            return;
        }

        if( commandLine.hasOption("version") ){
            printResult("1.0.0");
            return;
        }

        if( commandLine.hasOption("out") ){
            String fmt = commandLine.getOptionValue("out");
            if(StringUtils.isEmpty(fmt)){
                fmt = "yyyy-MM-dd HH:mm:ss";
            }
            printResult(DateFormatUtils.format(new Date(), fmt));
            return;
        }

        // calendar: 'x' is not a git command. See 'calendar --help'.
        helper.printHelp(String.format("calendar: '%s' is not a calendar command. See 'calendar --help'.", Arrays.toString(commandLine.getArgs())), options, false);
    }

定義程序入口:

public static void main(String[] args) {
        // 定義階段
        Options options = initOptions();
        // 解析階段
        CommandLine commandLine = parseArguments(options, args);
        // 詢問階段
        handleCommand(options, commandLine);
    }

打包

這里我們引入maven-assembly-plugin插件,主要幫助在打包時將依賴包一并寫入jar文件,同時將入口文件定義到manifest:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>3.3.0</version>
    <executions>
        <execution>
            <id>package-jar-with-dependencies</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>${main-class}</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <!-- bin,jar-with-dependencies,src,project -->
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
        </execution>
    </executions>
</plugin>

可以直接通過maven插件或者下的命令,將上面的代碼打包成jar文件

mvn clean package

測試jar

如果安裝上面的配置,最終會在項目target目錄輸出一個以jar-with-dependencies為后綴的jar文件,通過下面的命令可以測試cli命令

java -jar ./target/calendar-jar-with-dependencies.jar -h

這樣的CLI可不是我們想要的,一來需要依賴JRE的運行環境,同時調用極其不方便。

生成exe

如果你看過之前的文章,關于GraalVM的使用,按照文檔下載并配置好運行環境后,可以通過下面的命令對上一步的jar文件進一步處理

native-image -jar [jar] -o [name]

native-image -jar ./target/calendar-jar-with-dependencies.jar -o calendar

通過上面的命令會生成一個calendar.exe文件,這樣將其加入到環境變量后,則可以在windows平臺終端上使用了

對于不喜歡直接使用命令的,當然這里也可以使用插件exec-maven-plugin,在maven生命周期package階段,自動執行上面的命令,這樣整個過程只需要執行mvn clean package即可

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>3.1.0</version>
    <executions>
        <execution>
            <id>native-image-app</id>
            <phase>package</phase>
            <goals>
                <goal>exec</goal>
            </goals>
            <configuration>
                <environmentVariables>
                </environmentVariables>
                <!-- native-image -jar ./target/tool-jar-with-dependencies.jar -o tool -->
                <executable>native-image</executable>
                <arguments>
                    <argument>-jar</argument>
                    <argument>${project.basedir}/target/${project.build.finalName}-jar-with-dependencies.jar</argument>
                    <argument>-o</argument>
                    <argument>${project.build.finalName}</argument>
                </arguments>
            </configuration>
        </execution>
    </executions>
</plugin>

測試exe

在終端執行下面的命令接口看到預期的結果:

calendar.exe -O yyyy-MM-dd

總結

總的來說,Apache Commons CLI是一個非常強大的工具,可以幫助你輕松地處理命令行參數。無論你的應用程序需要處理多少個參數,或者這些參數的類型是什么, Commons CLI都可以提供幫助。

責任編輯:武曉燕 來源: Java技術指北
相關推薦

2024-02-26 10:22:53

2021-11-15 11:03:09

接口壓測工具

2025-01-08 11:00:00

AIshell開源

2009-07-07 11:38:54

jsp oracle

2017-05-03 13:37:05

Linuxweb性能監測

2024-04-16 08:09:36

JavapulsarAPI

2015-09-01 14:09:22

2024-06-10 23:07:05

2023-04-08 10:04:45

2025-04-09 03:00:00

2016-01-06 09:57:23

編寫PHP擴展

2023-12-12 08:08:17

插件PRPulsar

2013-09-10 09:54:50

2015-08-19 09:29:35

Git協議編寫

2021-04-07 13:38:27

Django項目視圖

2021-04-13 06:35:13

Elixir語言編程語言軟件開發

2020-10-12 10:58:15

IDEA插件監聽

2022-05-23 08:05:14

benchstat工具Go

2017-09-07 19:21:20

Java語言Iodine

2022-09-30 09:33:55

ViteCLI
點贊
收藏

51CTO技術棧公眾號

26uuu另类亚洲欧美日本一| 欧美一区二区私人影院日本| 蜜桃久久精品乱码一区二区| 无码人妻一区二区三区免费| 日韩三级在线| 欧美一区二区三区免费大片| 久久精品免费一区二区| 性开放的欧美大片| 国产美女精品一区二区三区| 国产做受高潮69| 无码少妇一区二区| 日韩精品视频中文字幕| 黑人精品xxx一区一二区| 视频一区国产精品| 性生活视频软件| 天堂va蜜桃一区二区三区 | mm131国产精品| 直接在线观看的三级网址| 91小视频在线免费看| 国产在线精品自拍| 久久久精品免费看| 综合激情网站| 亚洲天堂网站在线观看视频| 香蕉视频在线观看黄| 日韩中文在线播放| 亚洲1区2区3区4区| 福利在线小视频| 成人在线观看网站| 91一区在线观看| 91超碰rencao97精品| 天天综合久久综合| 亚洲欧洲一区二区天堂久久| 精品国产欧美成人夜夜嗨| 亚洲一区二区在线免费| 国产成人视屏| 欧美猛男男办公室激情| 青青在线视频观看| 国产在线88av| 一二三四区精品视频| 一区二区三区四区国产| 九色在线播放| 26uuu亚洲| 精品久久sese| 免费观看国产精品| 丁香亚洲综合激情啪啪综合| 亚洲一区制服诱惑| 97国产精品久久久| 六月丁香婷婷久久| 国产拍精品一二三| 中文字幕人妻精品一区| 爽好久久久欧美精品| 欧美专区在线视频| 人妻 日韩精品 中文字幕| 亚洲美女网站| 欧美性在线观看| 中文字幕日韩一级| 国产精品日韩久久久| 欧美亚州一区二区三区| 在线观看亚洲天堂| 免费日韩av| 日本高清视频精品| 日韩黄色片网站| 全国精品久久少妇| 成人av电影天堂| av免费在线不卡| 国产成人综合视频| 国产欧美韩日| 蜜芽tv福利在线视频| 国产欧美日韩不卡| 亚洲精品国产精品国自产观看| 三级外国片在线观看视频| 中文字幕一区三区| 五月天激情图片| 99久久精品免费看国产小宝寻花| 午夜国产精品一区| 国产精品久久久久9999小说| 欧洲亚洲精品久久久久| 日韩欧美的一区| 日韩www视频| 黑丝美女一区二区| 久久影院模特热| 国产污视频在线看| 免费人成精品欧美精品| 99国产视频在线| 日韩欧美在线番号| 国产精品久久久久aaaa樱花| 少妇一晚三次一区二区三区| 国产亚洲成av人片在线观看| 精品1区2区3区| 9191在线视频| 一区二区三区日本久久久| 爽爽爽爽爽爽爽成人免费观看| 国产女人被狂躁到高潮小说| 一区二区高清| 国产精品天天狠天天看| 亚洲国产成人在线观看| 久久久精品中文字幕麻豆发布| 正义之心1992免费观看全集完整版| 欧美78videosex性欧美| 色婷婷av一区二区| 香蕉视频1024| 国产亚洲欧美日韩在线观看一区二区| 久久亚洲成人精品| 精品在线视频免费| 麻豆精品一区二区综合av| 成人国产1314www色视频| 成人综合影院| 五月婷婷综合网| 日本激情综合网| 51亚洲精品| 日韩在线小视频| 中文字幕一区二区三区四区欧美| 国产一区二区美女诱惑| 日本欧洲国产一区二区| 日本小视频在线免费观看| 欧美在线观看一区| 亚洲欧美日本一区| 午夜亚洲福利| 国产日韩欧美电影在线观看| 免费毛片在线| 五月综合激情日本mⅴ| 91欧美一区二区三区| 精品大片一区二区| 7777精品视频| 黄色a在线观看| 亚洲精品乱码久久久久久| 牛夜精品久久久久久久| 香蕉一区二区| 97香蕉超级碰碰久久免费的优势 | 精品久久久久香蕉网| 一本一本久久a久久| 天堂在线亚洲视频| 免费中文日韩| 蜜桃在线视频| 日韩电影免费在线观看中文字幕| 久久久久久久久久99| 国产一区中文字幕| 午夜啪啪免费视频| 日韩精品一级毛片在线播放| 伊人久久久久久久久久久久久| 色一情一乱一伦| 久久综合色婷婷| 国产成人精品视频免费看| 国语一区二区三区| 国模精品系列视频| 欧美一级一区二区三区| 亚洲五月六月丁香激情| 2一3sex性hd| 国产日韩一区二区三区在线| 精品人伦一区二区三区| 国产高清中文字幕在线| 亚洲国产精久久久久久久| 免费一级特黄特色大片| 成人黄色777网| 我的公把我弄高潮了视频| 国产精品午夜av| 欧美性受xxx| 高清在线观看av| 欧美日韩一区二区三区高清| 乱老熟女一区二区三区| 国模娜娜一区二区三区| 91精品国产毛片武则天| www.成人网| 欧美在线视频在线播放完整版免费观看 | 免费观看a级片| 美女网站一区二区| 欧美三级午夜理伦三级老人| 91精品啪在线观看国产手机| 97**国产露脸精品国产| 极品美乳网红视频免费在线观看 | 亚洲成人福利在线观看| 日韩久久综合| 国产精品二区三区| 在线看片国产福利你懂的| 一二美女精品欧洲| 国产日本精品视频| 亚洲成av人在线观看| 色天使在线视频| 免费看黄色91| 日韩a级黄色片| 神马久久一区二区三区| 成人黄色在线免费| 日本一本在线免费福利| 精品亚洲夜色av98在线观看| 中文天堂在线资源| 一区av在线播放| 色婷婷av777| 国产在线观看免费一区| 国产91xxx| 欧美电影一区| 国产综合18久久久久久| 国产精品久久久久77777丨| 欧美日本中文字幕| 国产三级视频在线看| 欧美一区二区三区四区高清| 国产乱国产乱老熟| 亚洲欧美视频在线观看视频| 免费看黄色aaaaaa 片| 精品一区二区三区在线观看国产| 欧美久久久久久久久久久久久| 日韩精品一区二区久久| 国产综合精品一区二区三区| 九九九伊在线综合永久| 久久男人的天堂| 在线激情免费视频| 日韩精品黄色网| 国产精品无码AV| 91国模大尺度私拍在线视频| 久久久久成人精品无码| 中日韩免费视频中文字幕| 50一60岁老妇女毛片| 国产乱人伦偷精品视频免下载| 国产a级一级片| 激情av一区| 在线观看av的网址| 波多野结衣在线观看一区二区三区| 成人情视频高清免费观看电影| 欧美日韩尤物久久| 欧美影院在线播放| 韩国成人免费视频| 美女av一区二区三区| 爱爱爱免费视频在线观看| 亚洲精品国偷自产在线99热| 精品国产乱码一区二区三| 欧美日韩高清影院| 一级一级黄色片| 一本在线高清不卡dvd| 99热国产在线观看| 亚洲国产日韩a在线播放| 三级av在线免费观看| 国产女人aaa级久久久级 | 国产欧美自拍一区| 51国产成人精品午夜福中文下载| 久久久久久久性潮| 国产精品www网站| www.日韩| 日韩美女视频免费在线观看| 欧美gv在线| 97视频在线免费观看| 高端美女服务在线视频播放| 久久久久久久久久久免费精品 | 亚洲一区二区中文在线| 波多野结衣亚洲一区二区| 中文字幕色av一区二区三区| 免费成人美女女在线观看| 国产精品成人在线观看| av黄色免费在线观看| 国产精品国产精品国产专区不片 | 国产精品国产三级国产在线观看 | 秋霞成人影院| 久久久91精品国产一区不卡| 黄在线免费看| 欧美大胆a视频| www欧美xxxx| 97在线免费观看| 国产精欧美一区二区三区蓝颜男同| 欧美亚洲日本网站| 欧美特大特白屁股xxxx| 国产精品国产自产拍高清av水多 | 操人视频欧美| 国产美女撒尿一区二区| 久久久久久久有限公司| 精品久久久久中文字幕小说| 亚洲精品高清国产一线久久| 亚洲电影在线一区二区三区| 久久久久久久香蕉| 日韩一区二区久久| 激情网站五月天| 久久精品国产亚洲aⅴ| 美女被艹视频网站| 波多野结衣视频一区| 在线观看福利片| 成人免费小视频| 精品少妇一二三区| 色婷婷综合久久久中文一区二区 | 韩国av一区二区三区四区| 国产精品igao网网址不卡| 不卡区在线中文字幕| 免费在线观看污| 亚洲欧美在线高清| 久久高清免费视频| 欧美性大战xxxxx久久久| 99久久一区二区| 国产午夜精品久久久| 欧美jizz18hd性欧美| 久久久久久久电影一区| 精品123区| 国产精品xxx在线观看www| 你懂的一区二区三区| 欧美日韩一级在线| 国产精品综合| 日本特黄在线观看| 久久久久久久网| 精品欧美一区二区久久久久| 欧美性猛交xxxx富婆弯腰| 国产裸体无遮挡| 亚洲免费高清视频| 国产在线高清视频| 热re91久久精品国99热蜜臀| 欧美区一区二区| 日本成人黄色免费看| 欧美日韩国产一区精品一区| 成人免费毛片播放| 成人免费高清在线| 一级免费黄色录像| 欧美午夜片在线免费观看| 国产视频在线观看免费| 亚洲欧洲第一视频| av白虎一区| 99热在线播放| 欧美激情电影| 日本xxxxxxx免费视频| 成人在线一区二区三区| 少妇的滋味中文字幕bd| 欧美三级免费观看| 亚洲精品视频网| 久久夜色精品国产亚洲aⅴ| 色综合一本到久久亚洲91| 国产精品一区二区三区在线| 希岛爱理一区二区三区| 成年人小视频网站| 99亚偷拍自图区亚洲| 青青青在线免费观看| 欧美日韩国产综合草草| 国产私拍精品| 日本91av在线播放| 日韩系列在线| 国产精品无码av在线播放| 高清国产一区二区| 青青草精品在线视频| 777欧美精品| 麻豆传媒视频在线| 国产精品偷伦免费视频观看的| 精品日韩欧美一区| 日韩亚洲在线视频| 久久免费视频色| 日韩久久中文字幕| 亚洲精品日韩在线| 亚洲一级少妇| 蜜桃av噜噜一区二区三区| 亚洲欧美日韩专区| 一级性生活大片| 色婷婷国产精品| 激情福利在线| 国产国产精品人在线视| 精品视频99| 欧美女同在线观看| 国产精品久久久久久久久免费丝袜 | 国产精品porn| 在线播放av网址| 亚洲国产精品嫩草影院| 色婷婷激情五月| 欧美性受xxxx白人性爽| 国产欧美日韩精品一区二区免费| 激情网站五月天| 中文字幕免费观看一区| 91禁在线观看| 欧美大片网站在线观看| 久久a级毛片毛片免费观看| 免费看国产曰批40分钟| 久久日韩粉嫩一区二区三区| 国产第一页在线观看| 中文字幕在线看视频国产欧美| 91视频亚洲| a级黄色小视频| 久久久亚洲国产美女国产盗摄| 日韩中文字幕高清| 日韩中文字幕网| 一区二区三区四区高清视频| 日本福利视频一区| 欧美一区二区三区视频免费播放 | 国产98色在线|日韩| 日本午夜小视频| 亚洲人成五月天| 久久天堂影院| 白白操在线视频| 久久综合久久综合九色| 中文字幕日日夜夜| 久久国产天堂福利天堂| 欧美午夜寂寞| 天天干天天干天天干天天干天天干| 中文字幕一区二区三区在线不卡 | 中文字幕+乱码+中文乱码www| 日韩中文在线中文网在线观看| 国产精品亚洲欧美一级在线| 777av视频| 国产精品欧美久久久久无广告| 亚洲精品一区二区三区四区| 欧美在线日韩在线| 国产精品x453.com| 国产又粗又长又爽| 欧美日本精品一区二区三区| 91在线超碰| 性刺激综合网| av午夜精品一区二区三区| 怡红院成永久免费人全部视频| 国内精品小视频| 围产精品久久久久久久| 亚洲午夜久久久久久久久红桃| 91精品国产综合久久久久久久久久 |