rocketmq番外篇(一):開發命令列

匠心零度發表於2019-02-22

匠心零度 轉載請註明原創出處,謝謝!

rocketmq番外篇(一):開發命令列

說在前面

雖然是以rocketmq引出的開發命令列,但是任何java應用如果需要都可以借鑑引用,也是通用技術。

主題

  • rocketmq使用例子
  • Apache Commons CLI簡介
    • 總覽
    • 開發使用
  • rocketmq藉助Apache Commons CLI如何開發
  • 結尾

rocketmq使用例子

usage: mqbroker [-c <arg>] [-h] [-m] [-n <arg>] [-p]
 -c,--configFile <arg>       Broker config properties file
 -h,--help                   Print help
 -m,--printImportantConfig   Print important config item
 -n,--namesrvAddr <arg>      Name server address list, eg: 192.168.0.1:9876;192.168.0.2:9876
 -p,--printConfigItem        Print all config item
複製程式碼

這種是怎麼開發出來的呢?本篇重點就是分析如果用java開發命令列,簡單檢視程式碼如下圖:

rocketmq番外篇(一):開發命令列

我們可以知道是藉助了 Apache Commons CLI 工具進行開發的。

Apache Commons CLI簡介

總覽

官網地址:http://commons.apache.org/proper/commons-cli/

The Apache Commons CLI library provides an API for parsing command line options passed to programs. It`s also able to print help messages detailing the options available for a command line tool.
複製程式碼

**備註:**Apache Commons CLI庫提供了一個API,用於解析命令列選項傳遞給程式。也能夠幫助列印訊息詳細選項的命令列工具。

Apache Commons CLI 支援的格式有:

  • POSIX like options (ie. tar -zxvf foo.tar.gz)
  • GNU like long options (ie. du --human-readable --max-depth=1)
  • Java like properties (ie. java -Djava.awt.headless=true -Djava.net.useSystemProxies=true Foo)
  • Short options with value attached (ie. gcc -O2 foo.c)
  • long options with single hyphen (ie. ant -projecthelp)

開發使用

官網地址:http://commons.apache.org/proper/commons-cli/introduction.html

想要開發達到上面的效果,需要三步即可:

  • 定義階段(Definition Stage)
  • 解析階段(Parsing Stage)
  • 詢問階段(Interrogation Stage)

定義階段(Definition Stage)

主要就是Options以及Option來定義命令有那些,說明是什麼,是否必填,是否有引數等。

解析階段(Parsing Stage)

主要就是通過 CommandLineParser解析得到CommandLine物件。

詢問階段(Interrogation Stage)

主要就是通過CommandLine獲取相關內容資訊。

下面我們結合rocketmq的例子來實現類似功能:

rocketmq藉助Apache Commons CLI如何開發

我把rocketmq裡面程式碼稍微修改下,之後放在了一個簡單的一個類裡面就可以顯示出來:

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 TestCLI {
    public static void main(String[] args) {

        //定義階段(Definition Stage)
        Options options = new Options();

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

        opt =
            new Option("n", "namesrvAddr", true,
                "Name server address list, eg: 192.168.0.1:9876;192.168.0.2:9876");
        opt.setRequired(false);
        options.addOption(opt);

        opt = new Option("c", "configFile", true, "Broker 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);

        opt = new Option("m", "printImportantConfig", false, "Print important config item");
        opt.setRequired(false);
        options.addOption(opt);

        //解析階段(Parsing Stage)
        CommandLineParser parser =new PosixParser();
        HelpFormatter hf = new HelpFormatter();
        hf.setWidth(110);
        CommandLine commandLine = null;
        try {
            commandLine = parser.parse(options, args);
            if (commandLine.hasOption(`h`)) {
                hf.printHelp("mqbroker", options, true);
                System.exit(-1);
            }
        } catch (ParseException e) {
            hf.printHelp("mqbroker", options, true);
        }

        //詢問階段(Interrogation Stage)
        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);
            }
        }
    }

}

複製程式碼

程式執行結果:

rocketmq番外篇(一):開發命令列
rocketmq番外篇(一):開發命令列

大功告成!!!

結尾

今天僅僅只是開始,期待你的持續關注,讓我們一起走進rocketmq的世界!!!


如果讀完覺得有收穫的話,歡迎點贊、關注、加公眾號【匠心零度】,查閱更多精彩歷史!!!

加入知識星球,一起探討!

rocketmq番外篇(一):開發命令列

相關文章