Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / Apache Commons CLI命令行启动

今天又看了下Hangout的源码,一般来说一个开源项目有好几种启动方式——比如可以从命令行启动,也可以从web端启动。今天就看看如何设计命令行启动...

Apache Commons CLI

Apache Commons CLI是开源的命令行解析工具,它可以帮助开发者快速构建启动命令,并且帮助你组织命令的参数、以及输出列表等。CLI分为三个过程:
  • 定义阶段:在Java代码中定义Optin参数,定义参数、是否需要输入值、简单的描述等
  • 解析阶段:应用程序传入参数后,CLI进行解析
  • 询问阶段:通过查询CommandLine询问进入到哪个程序分支中

举个栗子

定义阶段:

Options options = new Options();Option opt = new Option("h", "help", false, "Print help");opt.setRequired(false);options.addOption(opt);opt = new Option("c", "configFile", true, "Name server 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);其中Option的参数:
  • 第一个参数:参数的简单形式
  • 第二个参数:参数的复杂形式
  • 第三个参数:是否需要额外的输入
  • 第四个参数:对参数的描述信息

解析阶段

通过解析器解析参数CommandLine commandLine = null;CommandLineParser parser = new PosixParser();try {commandLine = parser.parse(options, args);}catch(Exception e){//TODO xxx}

询问阶段

根据commandLine查询参数,提供服务HelpFormatter hf = new HelpFormatter();hf.setWidth(110);if (commandLine.hasOption("h")) {// 打印使用帮助hf.printHelp("testApp", options, true);}

全部代码样例

package hangout.study;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 CLITest {public static void main(String[] args) {String[] arg = { "-h", "-c", "config.xml" };testOptions(arg);}public static void testOptions(String[] args) {Options options = new Options();Option opt = new Option("h", "help", false, "Print help");opt.setRequired(false);options.addOption(opt);opt = new Option("c", "configFile", true, "Name server 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);HelpFormatter hf = new HelpFormatter();hf.setWidth(110);CommandLine commandLine = null;CommandLineParser parser = new PosixParser();try {commandLine = parser.parse(options, args);if (commandLine.hasOption("h")) {// 打印使用帮助hf.printHelp("testApp", options, true);}// 打印opts的名称和值System.out.println("--------------------------------------");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);}}}catch (ParseException e) {hf.printHelp("testApp", options, true);}}}

运行结果

usage: testApp [-c <arg>] [-h] [-p] -c,--configFile <arg> Name server config properties file -h,--help Print help -p,--printConfigItemPrint all config item--------------------------------------help=>nullconfigFile=>config.xml

Hangout中的应用

源码片段

package hangout.study;import org.apache.commons.cli.BasicParser;import org.apache.commons.cli.CommandLine;import org.apache.commons.cli.CommandLineParser;import org.apache.commons.cli.HelpFormatter;import org.apache.commons.cli.Options;import org.apache.commons.cli.ParseException;public class HangoutMainTest {/** * 解析Hangout参数 ** @param args * @return * @throws ParseException */private static CommandLine parseArg(String[] args) throws ParseException {//定义阶段Options options = new Options();options.addOption("h", false, "usage help");options.addOption("help", false, "usage help");options.addOption("f", true, "configuration file");options.addOption("l", true, "log file");options.addOption("w", true, "filter worker number");options.addOption("v", false, "print info log");options.addOption("vv", false, "print debug log");options.addOption("vvvv", false, "print trace log");//解析阶段CommandLineParser paraer = new BasicParser();CommandLine cmdLine = paraer.parse(options, args);//询问阶段if (cmdLine.hasOption("help") || cmdLine.hasOption("h")) {/*usage(); //这里作者自定义了帮助信息,其实可以使用helpFormat直接输出的*/HelpFormatter hf = new HelpFormatter();hf.setWidth(110);hf.printHelp("testApp", options, true);System.exit(-1);}// TODO need process invalid argumentsif (!cmdLine.hasOption("f")) {throw new IllegalArgumentException("Required -f argument to specify config file");}return cmdLine;}public static void main(String[] args) throws Exception {String[] arg = {"-h","xx.file"};//输入参数CommandLine cmdLine = parseArg(arg);//解析参数System.out.println(cmdLine.getOptionValue("f"));//拿到重要参数//TODO}}

参考

1 Apache Commons CLI 下载地址
2 Apache Commons CLI 官方指南
3 IBM 开发者文档  http://www.linuxidc.com/Linux/2016-06/132607.htm
4 Commons CLI 使用详解 http://www.linuxidc.com/Linux/2016-06/132591.htm本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-06/132608.htm