使用 Apache Commons CLI 开发命令行工具示例-阿里云开发者社区

开发者社区> cloudcoder> 正文

使用 Apache Commons CLI 开发命令行工具示例

简介:
+关注继续查看

概念说明

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"optionstrue);
            }

代码示例

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"optionstrue);
            }

            // 打印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"optionstrue);
        }
    }
}

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
eclipse - Java集成开发环境
Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。
1525 0
使用重构件(Codemod)加速 JavaScript 开发和重构
本文讲的是使用重构件(Codemod)加速 JavaScript 开发和重构,在花园里耕耘乐趣无穷,但如果除草不勤,最后收获可能是一团揪心。漏掉一次除草本身可能并无大碍,但积少成多最后会毁掉整座花园。没有杂草的花园让维护工作神清气爽。这个道理对代码库也类似。
1873 0
Docker编排工具Docker-compose
当然我们已经了解了Docker基础使用,当然我们要全面Docker化还有一段路要走,今天给大家带来的是编排工具,应为复杂度使用docker run 容器的时候需要配置很多内容比如端口映射,磁盘挂载,环境变量等,全部在命令中格式麻烦也不好保存,并且如果多个容器之前需要关联也特别麻烦,所以有了Docker三剑客之一的Docker-compose出面来解决这个问题.
97 0
Reflection.Emit的使用场景、工具包及示例总结
最近处理一个业务需要动态的生成一些业务模型和库,使用到了Emit的处理,相关的资料整理一下供参考。 Reflection.Emit目的 使用的场景: 应用中自定义一个自己的语言 运行中动态的创建类型、模块等,同时又需要提高效率(可以动态编译一次,然后就不用再处理了) 延迟绑定对象的使用,在和Office这类的软件时会用到 动态插件系统等 … System.
965 0
Apache Mina开发手册之二
Apache Mina开发手册之二 四、NIO概述 NIO API是Java 1.4版引入的,NIO的意思是非阻塞的I/O通信。 要知道Mina的NIO是基于NIO-1开发的,而在JDK 7中引入了NIO-2的库,但Mina还没有从NIO-2中获得各方面的提升,因此Mina还是基于NIO-1的。
907 0
Apache Mina开发手册
Apache Mina开发手册 一、介绍 Apache Mina是一个网络应用框架,简化用户开发高性能、高可扩展性的网络应用程序的难度。Mina提供了一个抽象的事件驱动的异步API,通过Java NIO实现各种传输协议如TCP/IP和UDP/IP。
1028 0
Ubuntu 中用 delphi 开发 apache
经过近15年的沉默。delphi 10.2 终于重新开始支持linux 开发了。 今天说一下在ubuntu中开发apache的方法。 首先安装ubuntu 的delphi 开发环境,请参考以前的文章 http://www.cnblogs.com/xalion/p/6368899.html   在delphi 10.2 中,只支持apache 2.4(既然有新的,不支持2.2也就无所谓了)。
1121 0
+关注
cloudcoder
热衷于大数据处理技术研究、使用 关注中间件技术
146
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载