精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美理论片在线播放| 中文字幕在线永久| 大地资源网3页在线观看| 国产一区二区福利| 97免费中文视频在线观看| 中文字幕被公侵犯的漂亮人妻| 91大神在线观看线路一区| 亚洲欧美一区二区三区孕妇| 国模一区二区三区私拍视频| 中文字幕免费观看视频| 欧美日本二区| 国产亚洲精品久久久久久牛牛 | 97se亚洲综合在线| 成人在线免费看视频| 亚洲自拍偷拍网| 国产丝袜一区二区三区免费视频| 制服丝袜中文字幕第一页| av老司机免费在线| 亚洲视频在线一区观看| 久久精品日产第一区二区三区精品版| 91精品国产乱码久久久| 免费亚洲婷婷| 亚洲18私人小影院| 国产激情无码一区二区三区| 神马久久一区二区三区| 精品国产凹凸成av人网站| 亚洲36d大奶网| 欧美aa免费在线| 亚洲最大色网站| 最新精品视频| 91九色在线porn| 久久久综合激的五月天| 国产激情一区二区三区在线观看 | 亚洲一区在线直播| 日本午夜在线视频| 成人精品一区二区三区四区| 成人免费黄色网| 中文字幕1区2区3区| 亚洲综合不卡| 97av在线视频| 国产一区二区三区影院| 在线国产欧美| 韩日欧美一区二区| 日本三级网站在线观看| 亚洲网站视频| 欧美激情精品久久久久久变态 | 中文字幕日韩欧美精品高清在线| 中文字幕久久精品| 大胸美女被爆操| 欧美日韩伦理在线免费| 国产一区二区三区久久精品| 亚欧洲乱码视频| 精品国产午夜| 这里只有精品视频在线| 国产一区二区三区四区在线| 国产午夜一区| 在线一区二区日韩| 精品视频第一页| 亚洲女同一区| 欧美高清一级大片| 国产污片在线观看| 亚洲一区二区动漫| 国产精品jvid在线观看蜜臀| 中文字幕人妻互换av久久 | 亚洲成人tv网| 免费国产黄色网址| 综合另类专区| 欧美久久一二区| 九九九久久久久久久| 91麻豆精品激情在线观看最新| 精品国产一区二区三区av性色 | 国产成人a人亚洲精品无码| 国产精品一区二区男女羞羞无遮挡 | 亚洲精品99久久久久| 添女人荫蒂视频| 成人羞羞动漫| 欧美成aaa人片免费看| 国产午夜精品无码一区二区| 美女91精品| 91精品久久久久久综合乱菊| 亚洲成人中文字幕在线| 91毛片在线观看| 亚洲精品自在在线观看| 日本高清成人vr专区| 天天射综合影视| 久久久久国产一区| 136福利精品导航| 亚洲欧美一区二区三区情侣bbw| 少妇愉情理伦三级| 国产一区二区三区四区三区四| 91av在线免费观看视频| 亚洲视频中文字幕在线观看| 成人免费视频一区二区| 欧美日韩免费精品| 深夜国产在线播放| 色婷婷激情一区二区三区| 国产一区二区在线观看免费视频| 6080成人| 色吧影院999| 国产成人亚洲欧洲在线| 精品一区免费av| 久久天堂国产精品| av免费在线观| 欧美三级电影在线看| 精品人妻一区二区免费视频| 色琪琪久久se色| 91av在线影院| 亚洲爱情岛论坛永久| 国产精品色噜噜| 狠狠97人人婷婷五月| 国产精品一区二区精品视频观看| 日韩国产中文字幕| 欧美成人三级在线观看| 久久国产精品区| 麻豆精品蜜桃一区二区三区| 怡红院红怡院欧美aⅴ怡春院| 色哟哟在线观看一区二区三区| 日本人dh亚洲人ⅹxx| 99久久.com| 国产大片精品免费永久看nba| 色欲av伊人久久大香线蕉影院| 亚洲视频在线一区观看| 免费看污污网站| 女优一区二区三区| 7m第一福利500精品视频| www.日韩高清| 亚洲欧美偷拍卡通变态| 中日韩av在线播放| 久久国产小视频| 国产精品扒开腿做爽爽爽男男 | 91在线看国产| 9色porny| 97品白浆高清久久久久久| 不卡av在线网站| 91久久久久久久久久久久| 国产亚洲欧美日韩日本| 亚洲熟女乱色一区二区三区| 欧美黄色录像| 69av在线播放| 午夜小视频免费| 福利一区福利二区微拍刺激| 超碰caoprom| 亚洲国产专区| 精品无码久久久久久久动漫| a级片免费在线观看| 欧美成人一区二区三区在线观看| 黄色片在线观看网站| 国产剧情一区在线| 成年人深夜视频| 国产成人一二| 午夜精品一区二区三区在线| 污视频在线免费观看| 欧美日韩国产精品一区| 免费成人深夜夜行p站| 久久九九国产| 亚洲一卡二卡区| 不卡一区视频| 欧美激情精品久久久久久| 天天干在线观看| 色婷婷综合久久久久中文一区二区| 亚洲熟妇无码av| 蜜臀久久99精品久久久久久9| 亚洲免费视频一区| av在线成人| 久久av红桃一区二区小说| 亚洲av无码一区二区乱子伦 | 麻豆乱码国产一区二区三区| 精品国产999久久久免费| 亚洲国产一区视频| 久久国产精品无码一级毛片| 日韩精品三区四区| 99精品视频网站| 国产成人福利av| 国产精品jvid在线观看蜜臀| 毛片在线播放a| 精品久久久久久亚洲综合网| 国产精品美女久久久久av爽| 中文字幕成人av| 老司机av网站| aa国产精品| 一区二区不卡在线观看| 99亚洲乱人伦aⅴ精品| 欧美尤物巨大精品爽| 调教视频免费在线观看| 亚洲丁香婷深爱综合| 中文字幕免费视频观看| 亚洲乱码中文字幕| 亚洲做受高潮无遮挡| 精久久久久久久久久久| 69堂免费视频| 99久久婷婷| 好吊色欧美一区二区三区 | 精品一区二区视频| 日韩色性视频| 欧美在线视频观看| 伊人春色在线观看| 一区二区三区天堂av| 亚洲欧美激情另类| 欧美偷拍一区二区| 日韩成人一区二区三区| 日韩毛片视频在线看| 中文字幕一区二区三区人妻| 国产一区二三区好的| 一本久道综合色婷婷五月| 午夜日韩av| 自拍亚洲欧美老师丝袜| 精品一区二区三区在线 | 三年中文在线观看免费大全中国| 亚洲伦伦在线| 国产精品一二三在线观看| 欧美日韩中字| 久久精品国产一区二区三区不卡| 精品国产鲁一鲁****| 国产精品久久久久久一区二区| 超碰在线资源| 免费不卡在线观看av| 亚洲成人影院麻豆| 亚洲欧洲xxxx| 婷婷在线免费观看| 欧美成人精品1314www| 亚洲香蕉在线视频| 91黄视频在线| 欧美黑人一区二区| 欧美日韩亚洲91| 国产大片aaa| 亚洲一区在线观看网站| 成人自拍小视频| 中文字幕一区二区三区四区不卡| 国产亚洲精品熟女国产成人| 91在线观看视频| 极品白嫩丰满美女无套| k8久久久一区二区三区| 国产极品一区二区| bt欧美亚洲午夜电影天堂| 麻豆tv在线观看| 国产a精品视频| 日本wwwxx| 国产成人在线影院| 亚洲精品久久一区二区三区777| 国产一区二区伦理| 韩国一区二区在线播放| 国产一区二三区| 三级网站免费看| 国产成人av一区二区三区在线 | 亚洲国产日韩a在线播放| 清纯粉嫩极品夜夜嗨av| 亚洲一区免费在线观看| 日本在线小视频| 精品高清美女精品国产区| 国产对白videos麻豆高潮| 午夜精品久久久| 国产综合精品视频| 欧美视频你懂的| 国产一区二区视频免费观看| 欧美日韩国产成人在线91| 国产精品久久综合青草亚洲AV| 欧美一区二区三区四区视频| 亚洲av无码乱码国产精品| 亚洲福利视频网| 欧美91精品久久久久国产性生爱| 一区二区三区视频免费在线观看 | 97在线日本国产| 英国三级经典在线观看| 国产精品欧美风情| 久久久久九九精品影院| 国产伦精品一区二区| 亚欧洲精品视频在线观看| 日韩欧美一区二区视频在线播放| 久久中文亚洲字幕| 99久久免费观看| 性欧美长视频| 中文字幕 欧美日韩| 国产成人高清在线| 人妻精品久久久久中文字幕| 欧美激情中文字幕一区二区| 日韩精品一区二区亚洲av性色| 亚洲综合色丁香婷婷六月图片| 国产无遮挡呻吟娇喘视频| 欧美手机在线视频| 亚洲精品久久久久久久久久| 亚洲男人天堂九九视频| 美女免费久久| 欧美有码在线观看| 国产精品久久免费视频| 久久艳妇乳肉豪妇荡乳av| 色欧美自拍视频| 国产欧美日韩网站| 美女视频一区在线观看| 五月天丁香社区| 中文在线免费一区三区高中清不卡| 欧美 日韩 国产 一区二区三区| 五月激情六月综合| 国产免费一区二区三区最新不卡| 亚洲的天堂在线中文字幕| 超碰免费在线观看| 国内偷自视频区视频综合| 成人交换视频| 好吊妞www.84com只有这里才有精品| 久久一区二区三区电影| 你懂的av在线| 国产剧情一区二区三区| 最新中文字幕av| 精品国产乱码久久久久久婷婷| 国产又黄又粗又硬| 亚洲色图欧美制服丝袜另类第一页| 羞羞污视频在线观看| 国产精品视频免费观看www| 老牛精品亚洲成av人片| 亚洲五码在线观看视频| 男人的天堂久久精品| 亚洲一区二区乱码| 一区二区三区在线视频观看| 中文字幕有码视频| 精品丝袜一区二区三区| 国产精品—色呦呦| 91精品视频一区| 欧美一区二区性| 116极品美女午夜一级| 国产a区久久久| 欧美日韩三级在线观看| 欧美日本在线看| www亚洲人| 国产精品99久久久久久人| 伊人久久大香线蕉综合网站| 可以看毛片的网址| 国产馆精品极品| 26uuu成人网| 在线观看91av| 色开心亚洲综合| 国产综合色香蕉精品| 欧美日韩一区二区三区视频播放| 午夜精品久久久久久久无码 | 国产在线综合视频| 日韩欧美高清视频| 五月婷婷开心中文字幕| 国语自产精品视频在线看抢先版图片| 欧美成年网站| 国产香蕉一区二区三区| 国产精品一区二区三区网站| 少妇被躁爽到高潮无码文| 91麻豆精品国产91久久久久| 久草资源在线| 成人有码在线视频| 亚洲精品在线观看91| 欧美精品 - 色网| 亚洲欧美乱综合| www.久久久久久| 高清欧美性猛交xxxx| 国产精品毛片久久久| 大j8黑人w巨大888a片| 91小视频在线| 免费观看日批视频| 自拍亚洲一区欧美另类| av成人在线播放| 经典三级在线视频| 国产成人精品免费| 亚洲欧美在线视频免费| 亚洲精品永久免费精品| 主播大秀视频在线观看一区二区| 四虎影视永久免费在线观看一区二区三区| 日韩国产在线观看一区| 成人欧美一区二区三区黑人一| 欧美一区二区三区在| 538在线精品| 欧美性色黄大片人与善| 捆绑调教一区二区三区| 国产女人18水真多毛片18精品| 精品三级在线观看| 久久电影tv| 一级一片免费播放| 成人精品视频一区二区三区尤物| 国产精品21p| 日韩中文字幕网站| 哺乳一区二区三区中文视频| 能在线观看的av| 亚洲欧美日韩小说| 五月婷婷六月色| 国产精品亚洲激情| 禁久久精品乱码| 少妇av片在线观看| 日韩精品一区二区三区视频播放| 女海盗2成人h版中文字幕| 中文字幕不卡每日更新1区2区| 国产1区2区3区精品美女| 一级黄色大片视频| 米奇精品一区二区三区在线观看| 激情小说一区| 制服丝袜中文字幕第一页| 午夜激情一区二区三区| 亚洲成人三级| 精品欧美日韩| 国产在线不卡一区| 青青青国产在线| 欧美成人免费一级人片100| 国产乱码精品一区二区三区四区 | 在线播放国产一区| 88国产精品欧美一区二区三区| 1024精品久久久久久久久| 久久久久久九九九九九| 精品国产a毛片|