java 使用 commons-cli 实现命令行参数

参考地址 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 来更方便地使用这个。

你可能感兴趣的:(java 使用 commons-cli 实现命令行参数)