【问题标题】:Creating subcommands with commons-cli使用 commons-cli 创建子命令
【发布时间】:2014-08-25 20:09:32
【问题描述】:

我正在尝试使用 commons-cli 创建一个简单的参数解析器,但我似乎无法弄清楚如何创建以下选项:

java ... com.my.path.to.MyClass producer 
java ... com.my.path.to.MyClass consumer -j 8

我的程序的第一个参数应该是producerconsumer,定义我的程序将运行的模式。如果它处于consumer 模式,我想要一个-j 参数定义要服务的线程数。

这是我目前得到的:

Options options = new Options();
options.addOption("mode", false, "Things.");

HelpFormatter formatter = new HelpFormatter();
formatter.printHelp("startup.sh", options);

当我打印出这些选项时,mode 参数显示为-mode

在 Python 的 argparse 中,我只需执行以下操作:

parser = argparse.ArgumentParser()
parser.add_argument('mode', choices=('producer', 'consumer'), required=True)
parser.print_help()

这正是我想要的。如何在 commons-cli 中执行此操作?

【问题讨论】:

  • 我的懒惰方法是为 Producer 创建一个类,为 Consumer 创建另一个类(抱歉,我知道这不是一个真正的答案)

标签: java apache-commons-cli


【解决方案1】:

picocli 现在包含在 Groovy 2.5.x 中。它内置了对子命令的支持。

【讨论】:

  • 明确一点:picocli 不需要 Groovy。您可以使用 picocli 在 Java 中创建带有子命令的命令行应用程序。 :-)
【解决方案2】:

我为这样的事情所做的就是为每个班级设置单独的选项。在您的 main 中,检查第一个参数以决定将哪个列表传递给解析器。 FWIW,我不认为它是“黑客”解决方案。

【讨论】:

    【解决方案3】:

    JCommander 就是答案。 commons-cli 似乎不支持这些选项。

    【讨论】:

      猜你喜欢
      • 2023-03-22
      • 1970-01-01
      • 2014-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-22
      • 2017-10-08
      相关资源
      最近更新 更多