歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Apache Commons CLI命令行啟動

Apache Commons CLI命令行啟動

日期:2017/3/1 9:14:41   编辑:Linux編程

今天又看了下Hangout的源碼,一般來說一個開源項目有好幾種啟動方式——比如可以從命令行啟動,也可以從web端啟動。今天就看看如何設計命令行啟動...

Apache Commons CLI

Apache Commons CLI是開源的命令行解析工具,它可以幫助開發者快速構建啟動命令,並且幫助你組織命令的參數、以及輸出列表等。

CLI分為三個過程:

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

舉個栗子

定義階段:

Options options = new Options();
Option opt = new Option("h", "help", false, "Print help");
opt.setRequired(false);
options.addOption(opt);

opt = new Option("c", "configFile", true, "Name server config properties file");
opt.setRequired(false);
options.addOption(opt);

opt = new Option("p", "printConfigItem", false, "Print all config item");
opt.setRequired(false);
options.addOption(opt);

其中Option的參數:

  • 第一個參數:參數的簡單形式
  • 第二個參數:參數的復雜形式
  • 第三個參數:是否需要額外的輸入
  • 第四個參數:對參數的描述信息

解析階段

通過解析器解析參數

CommandLine commandLine = null;
CommandLineParser parser = new PosixParser();
try {
    commandLine = parser.parse(options, args);
}catch(Exception e){
    //TODO xxx
}

詢問階段

根據commandLine查詢參數,提供服務

HelpFormatter hf = new HelpFormatter();
hf.setWidth(110);

if (commandLine.hasOption('h')) {
    // 打印使用幫助
    hf.printHelp("testApp", options, true);
}

全部代碼樣例

package hangout.study;

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PosixParser;

public class CLITest {
    public static void main(String[] args) {
        String[] arg = { "-h", "-c", "config.xml" };
        testOptions(arg);
    }
    public static void testOptions(String[] args) {
        Options options = new Options();
        Option opt = new Option("h", "help", false, "Print help");
        opt.setRequired(false);
        options.addOption(opt);

        opt = new Option("c", "configFile", true, "Name server config properties file");
        opt.setRequired(false);
        options.addOption(opt);

        opt = new Option("p", "printConfigItem", false, "Print all config item");
        opt.setRequired(false);
        options.addOption(opt);

        HelpFormatter hf = new HelpFormatter();
        hf.setWidth(110);
        CommandLine commandLine = null;
        CommandLineParser parser = new PosixParser();
        try {
            commandLine = parser.parse(options, args);
            if (commandLine.hasOption('h')) {
                // 打印使用幫助
                hf.printHelp("testApp", options, true);
            }

            // 打印opts的名稱和值
            System.out.println("--------------------------------------");
            Option[] opts = commandLine.getOptions();
            if (opts != null) {
                for (Option opt1 : opts) {
                    String name = opt1.getLongOpt();
                    String value = commandLine.getOptionValue(name);
                    System.out.println(name + "=>" + value);
                }
            }
        }
        catch (ParseException e) {
            hf.printHelp("testApp", options, true);
        }
    }
}

運行結果

usage: testApp [-c <arg>] [-h] [-p]
 -c,--configFile <arg>   Name server config properties file
 -h,--help               Print help
 -p,--printConfigItem    Print all config item
--------------------------------------
help=>null
configFile=>config.xml

Hangout中的應用

源碼片段

package hangout.study;

import org.apache.commons.cli.BasicParser;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;

public class HangoutMainTest {
    /**
     * 解析Hangout參數
     * 
     * @param args
     * @return
     * @throws ParseException
     */
    private static CommandLine parseArg(String[] args) throws ParseException {
        //定義階段
        Options options = new Options();
        options.addOption("h", false, "usage help");
        options.addOption("help", false, "usage help");
        options.addOption("f", true, "configuration file");
        options.addOption("l", true, "log file");
        options.addOption("w", true, "filter worker number");
        options.addOption("v", false, "print info log");
        options.addOption("vv", false, "print debug log");
        options.addOption("vvvv", false, "print trace log");
        //解析階段
        CommandLineParser paraer = new BasicParser();
        CommandLine cmdLine = paraer.parse(options, args);
        //詢問階段
        if (cmdLine.hasOption("help") || cmdLine.hasOption("h")) {
            /*usage(); //這裡作者自定義了幫助信息,其實可以使用helpFormat直接輸出的*/
            
            HelpFormatter hf = new HelpFormatter();
            hf.setWidth(110);
            hf.printHelp("testApp", options, true);
            
            System.exit(-1);
        }
        
        // TODO need process invalid arguments
        if (!cmdLine.hasOption("f")) {
            throw new IllegalArgumentException("Required -f argument to specify config file");
        }

        return cmdLine;
    }

    public static void main(String[] args) throws Exception {
        String[] arg = {"-h","xx.file"};//輸入參數
        CommandLine cmdLine = parseArg(arg);//解析參數
        System.out.println(cmdLine.getOptionValue("f"));//拿到重要參數
        //TODO
    }
}

參考

1 Apache Commons CLI 下載地址
2 Apache Commons CLI 官方指南
3 IBM 開發者文檔 http://www.linuxidc.com/Linux/2016-06/132607.htm
4 Commons CLI 使用詳解 http://www.linuxidc.com/Linux/2016-06/132591.htm

Copyright © Linux教程網 All Rights Reserved