参考地址 http://commons.apache.org/proper/commons-cli/usage.html
Apache Commons CLI 提供了一套 API 用于解析命令行选项,同时也可以打印各命令行选项说明。
Commons CLI supports different types of options:
- POSIX like options (ie.
tar -zxvf foo.tar.gz
) - GNU like long options (ie.
du --human-readable --max-depth=1
) - Java like properties (ie.
java -Djava.awt.headless=true -Djava.net.useSystemProxies=true Foo
) - Short options with value attached (ie.
gcc -O2 foo.c
) - long options with single hyphen (ie.
ant -projecthelp
)
下面是一个在 java 中使用的例子
private static Config parseCmdLine(String[] args) {
// 定义一个可选选项集
Options options = new Options();
// 添加一个选项 c ,并加上对应的简短说明,第二个参数表明这个选项是否跟有参数
options.addOption("c", true, "configOpt file, default path is ./ssdb.cfg");
// 定义一个选项组,这个组限定其所包含的选项是互斥的
OptionGroup optionGroup = new OptionGroup();
// 这里的 Option 方法只有两个参数,表明这个命令行选项不带参数
optionGroup.addOption(new Option("rm", "remove K/V from ssdb"));
optionGroup.addOption(new Option("disable", "disable K/V from ssdb with data remained"));
optionGroup.addOption(new Option("get", "get value from ssdb"));
optionGroup.addOption(new Option("mv", "mv from new client to old"));
// 设定此选项组是必选的,从而实现上面 4 个选项必须且只能选择一个
optionGroup.setRequired(true);
options.addOptionGroup(optionGroup);
// 初始化一个命令行解析器,一般用默认的就可以
CommandLineParser parser = new DefaultParser();
Config config = new Config();
try {
// 解析后会得到一个 CommandLine 对象
CommandLine cmd = parser.parse(options, args);
config = new Config();
// 获取选项 -c 的参数值,如果没有则使用第二个参数所指定的默认值
config.ssdbConfigPath = cmd.getOptionValue("c", "./ssdb.cfg");
// 判断选项 -rm 是否存在,返回的是 boolean 值
if (cmd.hasOption("rm")) {
config.operation = Operation.rm;
}
else if (cmd.hasOption("disable")) {
config.operation = Operation.disable;
}
else if (cmd.hasOption("get")) {
config.operation = Operation.get;
}
else if (cmd.hasOption("mv")) {
config.operation = Operation.mv;
}
else {
config.operation = Operation.unknown;
}
} catch (ParseException e) {
System.out.println(e.getMessage());
// 解析失败是用 HelpFormatter 打印 帮助信息
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp(
"java ssdb-del-helper-1.0-SNAPSHOT-jar-with-dependencies.jar",
options);
}
return config;
}
private static class Config {
String ssdbConfigPath;
Operation operation = Operation.unknown;
}
另 groovy 默认包含了 Apache Commons CLI,所以在 groovy 中默认就可以使用这套工具,并且 groovy 提供了一个内置的 DSL 来更方便地使用这个。