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