该示例将演示怎样使用 Commons Cli 定义属性(properties)类型的选项。定义属性选项方法如下:
Option property2 = new Option("C", "use value for given property(property=value)");
// 设置参数值的显示名称
property2.setArgName("键=值");
// 设置此选项可以采用的参数值数量
property2.setArgs(2);
// 设置值分隔符。例如:如果参数值为 Java 属性,则值分隔符将为“=”
property2.setValueSeparator('=');
// 设置此选项是否是必需的
property2.setRequired(true);
options.addOption(property2);程序运行方式:
$ java Demo4 -Dk1=v1 -Dk2=v2 -Ck3=v3
示例代码:
package com.hxstrive.cli;
import org.apache.commons.cli.*;
import java.util.Properties;
/**
* 使用 Commons CLI 定义 properties 类型的选项
*
* @author hxstrive.com
*/
public class Demo4 {
public static void main(String[] args) throws Exception {
// 模拟参数
args = new String[]{
"-Dclasspath=.;%java_home%/lib",
"-Dbasepath=D:/data",
"-Dcatalina_base=D:/apache-tomcat-7.0.64",
"-Cmodel=dev"
};
//====================================
// 定义一个选项
// 此种方式已经不推荐使用
//====================================
Options options = new Options();
Option property = OptionBuilder.withArgName("property=value").hasArgs(2)
.withValueSeparator()
.withDescription("use value for given property(property=value)").create("D");
property.setRequired(true);
options.addOption(property);
//====================================
// 推荐方式
//====================================
Option property2 = new Option("C",
"use value for given property(property=value)");
// 设置参数值的显示名称
property2.setArgName("键=值");
// 设置此选项可以采用的参数值数量
property2.setArgs(2);
// 设置值分隔符。例如:如果参数值为 Java 属性,则值分隔符将为“=”
property2.setValueSeparator('=');
// 设置此选项是否是必需的
property2.setRequired(true);
options.addOption(property2);
//====================================
// 输出帮助信息
//====================================
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp("Demo", options);
// 解析命令行
CommandLineParser lineParser = new DefaultParser();
CommandLine commandLine = lineParser.parse(options, args);
if(commandLine.hasOption("D")) {
System.out.println("[D]");
Properties properties = commandLine.getOptionProperties("D");
for (Object key : properties.keySet()) {
System.out.println(key + "=" + properties.get(key));
}
} else {
System.out.println("没有指定 -D 参数");
}
if(commandLine.hasOption("C")) {
System.out.println("[C]");
Properties properties = commandLine.getOptionProperties("C");
for(Object key : properties.keySet()) {
System.out.println(key + "=" + properties.get(key));
}
} else {
System.out.println("没有指定 -C 参数");
}
}
}运行程序,输出如下:
$ java Demo4 usage: Demo -C <键=值> use value for given property(property=value) -D <property=value> use value for given property(property=value) [D] basepath=D:/data classpath=.;%java_home%/lib catalina_base=D:/apache-tomcat-7.0.64 [C] model=dev