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

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

說在前面

雖然是以rocketmq引出的開發命令行,可是任何java應用若是須要均可以借鑑引用,也是通用技術。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開發命令行,簡單查看代碼以下圖:apache

咱們能夠知道是藉助了 Apache Commons CLI 工具進行開發的。

Apache Commons CLI簡介

總覽

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

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,用於解析命令行選項傳遞給程序。也可以幫助打印消息詳細選項的命令行工具。less

Apache Commons CLI 支持的格式有:ide

  • 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工具

想要開發達到上面的效果,須要三步便可:ui

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

定義階段(Definition Stage)spa

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

解析階段(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的世界!!!


若是讀完以爲有收穫的話,歡迎點贊、關注、加公衆號【匠心零度】,查閱更多精彩歷史!!!

加入知識星球,一塊兒探討!

相關文章
相關標籤/搜索