Linux中國

使用 commons-cli 解析 Java 中的命令行選項

通常向終端中輸入命令時,無論是啟動 GUI 應用程序還是僅啟動終端應用程序,都可以使用 命令行選項 options or switches or flags 以下簡稱選項)來修改應用程序的運行方式。這是 POSIX 規範 設定的標準,因此能夠檢測和解析選項對 Java 程序員而言是很有用的技能。

Java 中有若干種解析選項的方法,其中我最喜歡用的是 Apache Commons CLI 庫,簡稱 commons-cli

安裝 commons-cli

如果你使用類似 Maven 之類的項目管理系統以及 集成開發環境 Integrated Development Environment (簡稱 IDE),可以在項目屬性(比如 pom.xml 配置文件或者 Eclipse 和 NetBeans 的配置選項卡)中安裝 Apache Commons CLI 庫。

而如果你採用手動方式管理庫,則可以從 Apache 網站下載 該庫的最新版本。下載到本地的是幾個捆綁在一起的 JAR 文件,你只需要其中的一個文件 commons-cli-X.Y.jar(其中 X 和 Y 代指最新版本號)。把這個 JAR 文件或手動或使用 IDE 添加到項目,就可以在代碼中使用了。

將庫導入至 Java 代碼

在使用 commons-cli 庫之前,必須首先導入它。對於本次選項解析的簡單示例而言,可以先在 Main.java 文件中簡單寫入以下標準代碼:

package com.opensource.myoptparser;

import org.apache.commons.cli.*;

public class Main {
    public static void main(String[] args) {
    // code 
    }
}

至此在 Java 中解析選項的準備工作已經做好了。

在 Java 中定義布爾選項

要實現解析選項,首先要定義應用程序可接收的有效選項。使用 Option(注意是單數)類來創建選項對象,使用 Options(注意是複數)類來追蹤項目中創建的所有選項。

首先為選項創建一個組,按照慣例命名為 options

    //code
    Options options = new Options();

接下來,通過列出短選項(即選項名簡寫)、長選項(即全寫)、默認布爾值(LCTT 譯註:設置是否需要選項參數,指定為 false 時此選項不帶參,即為布爾選項)和幫助信息來定義選項,然後設置該選項是否為必需項(LCTT 譯註:下方創建 alpha 對象的代碼中未手動設置此項),最後將該選項添加到包含所有選項的 options 組對象中。在下面幾行代碼中,我只創建了一個選項,命名為 alpha

    //define options
    Option alpha = new Option("a", "alpha", false, "Activate feature alpha");
    options.addOption(alpha);

在 Java 中定義帶參選項

有時用戶需要通過選項提供 truefalse 以外的信息,比如給出配置文件、輸入文件或諸如日期、顏色這樣的設置項值。這種情況可以使用 builder 方法,根據選項名簡寫為其創建屬性(例如,-c 是短選項,--config 是長選項)。完成定義後,再將定義好的選項添加到 options 組中:

    Option config = Option.builder("c").longOpt("config")
        .argName("config")
        .hasArg()
        .required(true)
        .desc("set config file").build();
    options.addOption(config);

builder 函數可以用來設置短選項、長選項、是否為必需項(本段代碼中必需項設置為 true,也就意味著用戶啟動程序時必須提供此選項,否則應用程序無法運行)、幫助信息等。

使用 Java 解析選項

定義並添加所有可能用到的選項後,需要對用戶提供的參數進行迭代處理,檢測是否有參數同預設的有效短選項列表中的內容相匹配。為此要創建命令行 CommandLine 本身的一個實例,其中包含用戶提供的所有參數(包含有效選項和無效選項)。為了處理這些參數,還要創建一個 CommandLineParser 對象,我在代碼中將其命名為 parser。最後,還可以創建一個 HelpFormatter 對象(我將其命名為 helper),當參數中缺少某些必需項或者用戶使用 --help-h 選項時,此對象可以自動向用戶提供一些有用的信息。

    // define parser
    CommandLine cmd;
    CommandLineParser parser = new BasicParser();
    HelpFormatter helper = new HelpFormatter();

最後,添加一些條件判斷來分析用戶提供的選項,我們假設這些選項已經作為命令行輸入被獲取並存儲在 cmd 變數中。這個示例應用程序有兩種不同類型的選項,但對這兩種類型都可以使用 .hasOption 方法加上短選項名稱來檢測選項是否存在。檢測到一個存在的選項後,就可以對數據做進一步操作了。

try {
    cmd = parser.parse(options, args);
    if(cmd.hasOption("a")) {
    System.out.println("Alpha activated");
    }

    if (cmd.hasOption("c")) {
    String opt_config = cmd.getOptionValue("config");
    System.out.println("Config set to " + opt_config);
    }
} catch (ParseException e) {
    System.out.println(e.getMessage());
    helper.printHelp("Usage:", options);
    System.exit(0);
}

解析過程有可能會產生錯誤,因為有時可能缺少某些必需項如本例中的 -c--config 選項。這時程序會列印一條幫助信息,並立即結束運行。考慮到此錯誤(Java 術語中稱為異常),在 main 方法的開頭要添加語句聲明可能的異常:

public static void main(String[] args) throws ParseException {

示常式序至此就大功告成了。

測試代碼

你可以通過調整傳遞給代碼的默認參數來在 IDE 中測試應用程序,或者創建一個 JAR 文件並在終端運行測試。這個過程可能會因 IDE 的不同而不同。具體請參閱相應的 IDE 文檔,以及我寫過的關於如何創建 JAR 文件的文章,或者參考 Daniel Oh 的關於如何使用 Maven 執行同樣操作的文章。

首先,省略必需項 -c--config 選項,檢測解析器的異常處理:

$ java -jar dist/myapp.jar                 
Missing required option: c
usage: Usage:
 -a,--alpha             Activate feature alpha
 -c,--config <config>   Set config file

然後提供輸入選項再進行測試:

java -jar dist/myantapp.jar --config foo -a
Alpha activated
Config set to foo

選項解析

為用戶提供選項功能對任何應用程序來說都是很重要的。有了 Java 和 Apache Commons,要實現這個功能並不難。

以下是完整的演示代碼,供讀者參考:

package com.opensource.myapp;

import org.apache.commons.cli.*;

public class Main {

    /**
     * @param args the command line arguments
     * @throws org.apache.commons.cli.ParseException
     */ 
    public static void main(String[] args) throws ParseException {
        // define options
        Options options = new Options();

        Option alpha = new Option("a", "alpha", false, "Activate feature alpha");
        options.addOption(alpha);

        Option config = Option.builder("c").longOpt("config")
                .argName("config")
                .hasArg()
                .required(true)
                .desc("Set config file").build();
        options.addOption(config);

        // define parser
        CommandLine cmd;
        CommandLineParser parser = new BasicParser();
        HelpFormatter helper = new HelpFormatter();

        try {
            cmd = parser.parse(options, args);
            if(cmd.hasOption("a")) {
                System.out.println("Alpha activated");
            }

            if (cmd.hasOption("c")) {
                String opt_config = cmd.getOptionValue("config");
                System.out.println("Config set to " + opt_config);
            }
        } catch (ParseException e) {
            System.out.println(e.getMessage());
            helper.printHelp("Usage:", options);
            System.exit(0);
        }
    }
}

使用 Java 和選項

選項使用戶可以調整命令的工作方式。使用 Java 時解析選項的方法有很多,其中之一的 commons-cli 是一個強大而靈活的開源解決方案。記得在你的下一個 Java 項目中嘗試一下哦。

via: https://opensource.com/article/21/8/java-commons-cli

作者:Seth Kenlon 選題:lujun9972 譯者:unigeorge 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國