commons-cli命令行处理

Commons CLI

Apache Commons CLI库提供了一个API,用于解析传递给程序的命令行选项。它还能够打印详细说明命令行工具可用选项的帮助消息。命令行处理分为三个阶段。它们是定义,解析和询问阶段。

各个阶段的详细介绍见官方文档

maven依赖

<!-- https://mvnrepository.com/artifact/commons-cli/commons-cli -->
<dependency>
    <groupId>commons-cli</groupId>
    <artifactId>commons-cli</artifactId>
    <version>1.4</version>
</dependency>

定义阶段

CLI使用Options这个类来定义和设置参数,它是所有参数的容器。

Option

Options options = new Options();
Option option = new Option("t", "table", true, "table name");
options.addOption(option);
参数 含义 说明
opt 短名称参数
longOpt 长名称参数
hasArg 是否有参数值 当为false 后续获取值时返回null
description 描述

Option.builder

Option dbOption = Option.builder("d").argName("args")
    .hasArg()
    .longOpt("database")
    .desc("database name")
    .build();
options.addOption(dbOption);

解析阶段

CLI提供了接口CommandLineParser,并用不同的实现类来实现各种解析方式。BasicParser, GnuParser, PosixParser在since 1.3 不推荐使用了, 推荐直接使用DefaultParser。

类型 举例 描述
POSIX tar -zxvf foo.tar.gz
GNU中长参数形式 du --human-readable --max-depth=1
Java命令中的参数形式 java -Djava.awt.headless=true Foo
短杠带参数值的形式 curl -X POST www.baidu.com

我们以官方demo为例:

ant [options] [target [target2 [target3] ...]]
  Options: 
  -help                  print this message
  -projecthelp           print project help information
  -version               print the version information and exit
  -quiet                 be extra quiet
  -verbose               be extra verbose
  -debug                 print debugging information
  -emacs                 produce logging information without adornments
  -logfile <file>        use given file for log
  -logger <classname>    the class which is to perform logging
  -listener <classname>  add an instance of class as a project listener
  -buildfile <file>      use given buildfile
  -D<property>=<value>   use value for given property
  -find <file>           search for buildfile towards the root of the
                         filesystem and use it
args = new String[]{ "-help", "-Djava.awt.headless=true", "-version", "-logfile", "/data/xdb.txt"};
// 定义
Options options = new Options();
// boolean类型的option
Option help = new Option("help", "print this message");
Option version = new Option("version", "print the version information and exit");

// 参数类型的option, OptionBuilder 不推荐使用
Option logfile = Option.builder("logfile").argName("file")
        .hasArg()
        .desc("use given file for log")
        .build();

// k=v
Option properties = Option.builder("D").argName("property=value")
        .hasArgs()
        .valueSeparator()
        .build();

options.addOption(help);
options.addOption(version);
options.addOption(logfile);
options.addOption(properties);


// 解析阶段
CommandLine cmdLine = new DefaultParser().parse(options, args);
Properties d = cmdLine.getOptionProperties("D");
d.keySet().forEach(key->{
    System.out.println(key+":"+d.get(key));
});

if(cmdLine.hasOption("help")){
    HelpFormatter formatter = new HelpFormatter();
    formatter.printHelp( "ant [options] [target [target2 [target3] ...]]", options );
}

if(cmdLine.hasOption("version")){
    System.out.println("Version: 1.2.3");
}

String logfile1 = cmdLine.getOptionValue("logfile");
System.out.println("logfile:" + logfile1);

询问阶段

就是相当于查询命令的用法, 类似于 curl --help

HelpFormatter hf = new HelpFormatter();
hf.setWidth(110);
hf.printHelp("testApp", options, true);

项目地址

参考

Common-cli的使用