apache第一讲-commons cli

     大家好,从今天起带大家走进java企业级应用。搞java开发的应该都听过apache社区,apache 是IT行业鼎鼎有名的开源社区,该社区托管孵化了当前赫赫有名的项目:hadoop、spark、kafka、lucene等等。可以说计算机发展的如此迅速,尤其是时下如火如荼的大数据领域,apache社区功不可没 。

apache第一讲-commons cli

       apache commons-cli 是一个命令行参数解析工具,支持多种风格命令行参数的解析,能够生成优雅的帮助信息。可以说是编写命令行工具的必备神器。想想自己花了很多精力写了一个很NB的软件,结果在展示给自己团队或客户面前时因为很难用,大家不买账是不是非常憋屈,相反,有的人只做了一个很简单的工具,但是非常好用,帮助信息也很详细,对比一下是不是心里更憋屈。软件核心功能固然重要,但是对软件的包装也很重要,这些花哨的东西(如帮助信息、文档)才是你成果的展现,请记住不要让你的成果闷死在大脑里。

     今天我们的主角commons-cli就是这样一个对核心功能进行包装展示的工具类api,实战应用场景包括Ant, Hadoop等。commons-cli 支持以下风格的命令行参数解析:

  • POSIX 风格 如: tar -zxvf foo.tar.gz
    GNU 长参数风格: du --human-readable --max-depth=1
    Java 属性风格: java -Djava.awt.headless=true -Djava.net.useSystemProxies=true Foo 
    短杠带参数值风格: ie. gcc -O2 foo.c 
    长杠不带值风格: ant -projecthelp 
    

   通过apache commons cli 能够打印类似如下优雅的帮助信息


usage: ls
 -A,--almost-all          do not list implied . and ..
 -a,--all                 do not hide entries starting with .
 -B,--ignore-backups      do not list implied entried ending with ~
 -b,--escape              print octal escapes for nongraphic characters
    --block-size <SIZE>   use SIZE-byte blocks
 -c                       with -lt: sort by, and show, ctime (time of last
                          modification of file status information) with
                          -l:show ctime and sort by name otherwise: sort
                          by ctime
 -C                       list entries by columns 

示例:

代码位置:https://github.com/k6k4com/examples-apache-commons/tree/master/commons-cli

package com.k6k4.examples.apache.commons.cli;

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.DefaultParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.OptionBuilder;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;

/**
 * Created by k6k4 on 16/10/29.
 */
public class CliExample {
    public static void main(String[] args) throws ParseException {

        Options options = new Options();
        options.addOption("a", false, "hello a");
        options.addOption("b", true, "hello b");
        options.addOption("c", "c-long", false, "hello c");
        options.addOption("d", "d-long", true, "hello d");

        Option e = OptionBuilder.withArgName("eArg")
                .hasArg()
                .withDescription("hello e")
                .create("e");

        Option f = OptionBuilder.withArgName("key=value")
                .hasArgs(2)
                .withValueSeparator()
                .withDescription("hello f")
                .create("f");

        options.addOption(e);
        options.addOption(f);

        args = new String[]{"-a", "-b", "bValue", "--c-long", "-d", "dValue", "-fKey=fValue"};

        handle(options, args);

    }

    public static void handle(Options options, String[] args) throws ParseException {
        CommandLineParser parser = new DefaultParser();
        CommandLine cl = parser.parse(options, args);

        HelpFormatter hf = new HelpFormatter();
        hf.printHelp("Help Message", options);

        if (cl.hasOption("a")) {
            System.out.println("-a");
        }

        if (cl.hasOption("b")) {
            System.out.println("-b:" + cl.getOptionValue("b"));
        }

        if (cl.hasOption("c-long")) {
            System.out.println("--c-long");
        }

        System.out.println("--d-long:" + cl.getOptionValue("d-long", "dValueDefault"));

        System.out.println("-e:" + cl.getOptionValue("e", "eValueDefault"));

        if (cl.hasOption("f")) {
            System.out.println("-f:" + cl.getOptionValue("f"));
        }

    }
}



个人资料
时海
等级:8
文章:272篇
访问:16.0w
排名: 2
推荐圈子
上一篇: 一天一算法题,神奇的位运算
下一篇:BI项目中的ETL设计详解(数据抽取、清洗与转换 )
猜你感兴趣的圈子:
时海
标签: commons、cli、options、cl、addoption、面试题
隐藏