博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用 Apache Commons CLI 开发命令行工具示例
阅读量:7250 次
发布时间:2019-06-29

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

Apache Commons CLI 简介

        Apache Commons CLI 是 Apache 下面的一个解析命令行输入的工具包,该工具包还提供了自动生成输出帮助文档的功能。    

Apache Commons CLI 支持多种输入参数格式,主要支持的格式有以下几种:

  1. POSIX(Portable Operating System Interface of Unix)中的参数形式,例如 tar -zxvf foo.tar.gz

  2. GNU 中的长参数形式,例如 du --human-readable --max-depth=1

  3. Java 命令中的参数形式,例如 java -Djava.net.useSystemProxies=true Foo

  4. 短杠参数带参数值的参数形式,例如 gcc -O2 foo.c

  5. 长杠参数不带参数值的形式,例如 ant – projecthelp

    CLI 命令代码实现

    命令行程序处理流程相对比较简单,主要流程为设定命令行参数 -> 解析输入参数 -> 使用输入的数据进行逻辑处理

CLI 定义阶段

        每一条命令行都必须定义一组参数,它们被用来定义应用程序的接口。Apache Commons CLI 使用 Options 这个类来定义和设置参数,它是所有 Option 实例的容器。在 CLI 中,目前有两种方式来创建 Options,一种是通过构造函数,这是最普通也是最为大家所熟知的一种方式;另外一种方法是通过 Options 中定义的工厂方式来实现。

        CLI 定义阶段的目标结果就是创建 Options 实例。

// 创建 Options 对象 Options options = new Options();  // 添加 -h 参数 options.addOption("h", false, "Lists short help");  // 添加 -t 参数 options.addOption("t", true, "Sets the HTTP communication protocol for CIM connection");

其中 addOption() 方法有三个参数,第一个参数设定这个 option 的单字符名字,第二个参数指明这个 option 是否需要输入数值,第三个参数是对这个 option 的简要描述。在这个代码片段中,第一个参数只是列出帮助文件,不需要用户输入任何值,而第二个参数则是需要用户输入 HTTP 的通信协议,所以这两个 option 的第二个参数分别为 false 和 true

 

CLI 解析阶段

 

        在解析阶段中,通过命令行传入应用程序的文本来进行处理。处理过程将根据在解析器的实现过程中定义的规则来进行。在 CommandLineParser 类中定义的 parse 方法将用 CLI 定义阶段中产生的 Options 实例和一组字符串作为输入,并返回解析后生成的 CommandLine。

 

        CLI 解析阶段的目标结果就是创建 CommandLine 实例。

CommandLineParser parser = new PosixParser();  CommandLine cmd = parser.parse(options, args);  if(cmd.hasOption("h")) {     // 这里显示简短的帮助信息 }

CLI 询问阶段

        在询问阶段中,应用程序通过查询 CommandLine,并通过其中的布尔参数和提供给应用程序的参数值来决定需要执行哪些程序分支。这个阶段在用户的代码中实现,CommandLine 中的访问方法为用户代码提供了 CLI 的询问能力。

        CLI 询问阶段的目标结果就是将所有通过命令行以及处理参数过程中得到的文本信息传递给用户的代码。

commandLine = parser.parse(options, args);            if (commandLine.hasOption('h')) {                //打印使用帮助                hf.printHelp("testApp", options, true);            }

完整的代码示例:

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;/** * DateTime: 2015年1月1日 下午5:07:31 * */public class Test {    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);        }    }}

 

 

 

转载于:https://www.cnblogs.com/onmyway20xx/p/7346709.html

你可能感兴趣的文章
新书问答:Agile Management
查看>>
在sublime中实现代码检测
查看>>
活在伟大的Scrum团队是什么感觉
查看>>
Swift 5进入发布倒计时
查看>>
一套代码称霸5大端口,移动金融应用还能这样开发?
查看>>
MIT开发Polaris,使网页载入加快34%
查看>>
微软对macOS和Linux开放量子开发工具集
查看>>
一份关于Angular的倡议清单
查看>>
没有估算,你仍然可以用这些决策策略
查看>>
通过调研开源基准测试集,解读大数据的应用现状和开源未来
查看>>
译文-调整G1收集器窍门
查看>>
时序数据库InfluxDB 2.0 alpha 发布:主推新的Flux查询语言,TICK栈将成为整体
查看>>
开源是项“全民工程”,揭秘开源团队的管理运作
查看>>
基于Gitflow分支模型自动化Java项目工作流
查看>>
ES6学习之一
查看>>
专访何红辉:谈谈Android源码中的设计模式
查看>>
超2亿中国用户简历曝光!MongoDB又一重大安全事故
查看>>
网易云信周梁伟专访:亿级架构IM平台的技术难点解析
查看>>
独家揭秘腾讯千亿级参数分布式机器学习系统无量
查看>>
Dubbo Mesh在闲鱼生产环境的落地实践
查看>>