匠心零度 轉載請註明原創出處,謝謝!html
雖然是以rocketmq引出的開發命令行,可是任何java應用若是須要均可以借鑑引用,也是通用技術。java
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 工具進行開發的。官網地址: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
tar -zxvf foo.tar.gz
)du --human-readable --max-depth=1
)java -Djava.awt.headless=true -Djava.net.useSystemProxies=true Foo
)gcc -O2 foo.c
)ant -projecthelp
)官網地址:http://commons.apache.org/proper/commons-cli/introduction.html工具
想要開發達到上面的效果,須要三步便可:ui
定義階段(Definition Stage)spa
主要就是Options以及Option來定義命令有那些,說明是什麼,是否必填,是否有參數等。.net
解析階段(Parsing Stage)
主要就是經過 CommandLineParser解析獲得CommandLine對象。
詢問階段(Interrogation Stage)
主要就是經過CommandLine獲取相關內容信息。
下面咱們結合rocketmq的例子來實現相似功能:
我把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的世界!!!
若是讀完以爲有收穫的話,歡迎點贊、關注、加公衆號【匠心零度】,查閱更多精彩歷史!!!
加入知識星球,一塊兒探討!