查看原文
其他

rocketmq番外篇(一):开发命令行

2018-04-18 零度 匠心零度

匠心零度 转载请注明原创出处,谢谢!



说在前面

虽然是以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开发命令行,简单查看代码如下图:


我们可以知道是借助了 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的世界!!!


如果读完觉得有收获的话,欢迎点赞、关注、加公众号【匠心零度】,查阅更多精彩历史!!!

加入知识星球,一起探讨!


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存