博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Apache Commons CLI命令行启动
阅读量:6813 次
发布时间:2019-06-26

本文共 5253 字,大约阅读时间需要 17 分钟。

今天又看了下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 
] [-h] [-p] -c,--configFile
Name server config properties file -h,--help Print help -p,--printConfigItem Print 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 arguments        if (!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 }}

参考

本文转自博客园xingoo的博客,原文链接:,如需转载请自行联系原博主。
你可能感兴趣的文章
XWifiMouse早期写的一个Android鼠标App
查看>>
Android AIDL 客户端和服务端配置
查看>>
制作自己的镜像(二)
查看>>
運維之下標題
查看>>
OFBiz + Opentaps 目录管理 十二. 配置
查看>>
JAVA中RSA签名算法实现
查看>>
在etherscan上传合约源码
查看>>
postgres预写式日志的内核实现详解-wal记录写入
查看>>
用面向接口编程思想看找对象
查看>>
OC文件操作习题
查看>>
Nginx常用命令
查看>>
TWaver GIS在电信中的使用
查看>>
几款程序员常用的辅助编程工具
查看>>
ios 正则表达式语法参考
查看>>
《Java性能优化权威指南》读书笔记(二)
查看>>
几个比较大的在线提交系统(Online Judge)
查看>>
2.0 tar打包工具详解
查看>>
运动前后饮食注意事项(转)
查看>>
Mybatis缓存
查看>>
CentOS 6.5挂载NTFS格式硬盘
查看>>