匠心零度 轉載請註明原創出處,謝謝!
說在前面
雖然是以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的世界!!!
如果讀完覺得有收穫的話,歡迎點贊、關注、加公眾號【匠心零度】,查閱更多精彩歷史!!!
加入知識星球,一起探討!