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

时间:2024-10-17 20:05:21

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

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番外篇(一):开发命令行