该示例将演示怎样使用 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