【问题标题】:How to specify multiple options using apache commons cli?如何使用 apache commons cli 指定多个选项?
【发布时间】:2012-02-16 01:56:07
【问题描述】:

我想要类似的东西:

java programName  -jobs1 -C 10 -W 20
java programName  -job2
java programName  -job3

有内容:

Option o1 = new Option("job2", "some desc");
Option o2 = new Option("job3" , "(some desc")

Option o3 = OptionBuilder.hasArgs(2).withArgName( "W" ).withArgName("C").withDescription(  "Some desc" ).create("job1")
Option o4 = new Option("help");

Options os = new Options().addOption(o1).addOption(o2).addOption(o3).addOption(o4).

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

...输出在哪里:

Usage ProgramName
 -job1 <c>  Some Desc
 -job2      Some desc
 -job3      Some desc
 -help      Print this message

我希望-job1 应该打印-job1 -C &lt;&gt; -W &lt;&gt;

我错过了什么吗?它不适用于一个以上的论点。顺便说一句,我用的是commons-cli 1.2。

【问题讨论】:

  • 我认为你误解了hasArgs() 和withArgName()。
  • 使用 apache-commons-cli 似乎无法做到这一点 - 一个很少做的 apache 库。我期待更多。我会尝试看看是否可以添加更多功能...

标签: java apache-commons-cli


【解决方案1】:

你不能有上下文相关的参数。您可以使用以下参数:job1、job2、job3、C & W,但您不能(通过库)说 C & W 仅对 job1 有效。

如果 job1/2/3 互斥,则创建一个 OptionGroup。然后在代码中,确保只为 job1 提供 C & W。

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.GnuParser;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.OptionBuilder;
import org.apache.commons.cli.OptionGroup;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.HelpFormatter;

public class StackOverflowExample
{
    public static final String JOB1 = "job1";
    public static final Option job1 =
        OptionBuilder.hasArg(false)
            .isRequired(false)
            .withDescription("description of job1")
            .create(JOB1);

    public static final String JOB2 = "job2";
    public static final Option job2 =
        OptionBuilder.hasArg(false)
            .isRequired(false)
            .withDescription("description of job2")
            .create(JOB2);

    public static final String JOB3 = "job3";
    public static final Option job3 =
        OptionBuilder.hasArg(false)
            .isRequired(false)
            .withDescription("description of job3")
            .create(JOB3);

    public static final String MY_C = "C";
    public static final Option my_c =
        OptionBuilder.hasArg(true)
            .withArgName("count")
            .isRequired(false)
            .withDescription("description of C")
            .create(MY_C);

    public static final String MY_W = "W";
    public static final Option my_w =
        OptionBuilder.hasArg(true)
            .withArgName("width")
            .isRequired(false)
            .withDescription("description of W")
            .create(MY_W);


    public static void main(String[] args)
    {
        Options options = new Options();

        OptionGroup optgrp = new OptionGroup();
        optgrp.addOption(job1);
        optgrp.addOption(job2);
        optgrp.addOption(job3);

        options.addOptionGroup(optgrp);
        options.addOption(my_c);
        options.addOption(my_w);

        try {
            CommandLineParser parser = new GnuParser();
            CommandLine cmdline = parser.parse(options, args);

            if (((cmdline.hasOption(MY_C)) || (cmdline.hasOption(MY_W))) &&
                (! cmdline.hasOption(JOB1))) {
                HelpFormatter help = new HelpFormatter();
                help.printHelp("cmdname", options);
                System.exit(-1);
            }

            System.out.println("OK");
        }
        catch (Exception ex) {
            ex.printStackTrace();
            System.exit(-1);
        }
    }
}

产生以下输出:

<~/sandbox/CoreUtils/scratch> $ javac -d . -cp ~/sandbox/CoreUtils/lib/commons-cli-1.2.jar:. StackOverflowExample.java
<~/sandbox/CoreUtils/scratch> $ java -cp ~/sandbox/CoreUtils/lib/commons-cli-1.2.jar:. StackOverflowExample -C foo -job1
OK

<~/sandbox/CoreUtils/scratch> $ java -cp ~/sandbox/CoreUtils/lib/commons-cli-1.2.jar:. StackOverflowExample -C foo -job2
usage: cmdname
 -C <count>   description of C
 -job1        description of job1
 -job2        description of job2
 -job3        description of job3
 -W <width>   description of W

【讨论】:

  • 您创建job1 的方式甚至没有编译,我正在使用1.2 版的maven 进行依赖,您是如何使其工作的?
  • 你的样本不起作用。是否可以同时为 Options 定义一个 OptionGroup 和一个选项?
  • 我已经添加了导入、类结构和 try/catch 块。
  • @Kakawait - 我不明白你的问题。
猜你喜欢
  • 1970-01-01
  • 2015-03-05
  • 2016-12-18
  • 1970-01-01
  • 2016-11-23
  • 1970-01-01
  • 1970-01-01
  • 2012-07-29
  • 1970-01-01
相关资源
最近更新 更多