Java Commons CLI不支持我的命令行设置

Java Commons CLI不支持我的命令行设置,java,command-line-interface,apache-commons-cli,Java,Command Line Interface,Apache Commons Cli,在这里使用。我有一个可执行JAR,它需要2个运行时选项,fizz和buzz;两者都是需要参数/值的字符串。我希望(如果可能的话)我的应用程序可以这样执行: java-jarmyapp.jar-fizz“好的,那么!”-buzz“现在保重,那么再见!” 在这种情况下,fizz选项的值将是“好的,那么!”,等等 这是我的密码: public class MyApp { private Options cmdLineOpts = new Options(); private Comma

在这里使用。我有一个可执行JAR,它需要2个运行时选项,
fizz
buzz
;两者都是需要参数/值的字符串。我希望(如果可能的话)我的应用程序可以这样执行:

java-jarmyapp.jar-fizz“好的,那么!”-buzz“现在保重,那么再见!”

在这种情况下,
fizz
选项的值将是“好的,那么!”,等等

这是我的密码:

public class MyApp {
    private Options cmdLineOpts = new Options();
    private CommandLineParser cmdLineParser = new GnuParser();
    private HelpFormatter helpFormatter = new HelpFormatter();

    public static void main(String[] args) {
        MyApp myapp = new MyApp();
        myapp.processArgs(args);
    }

    private void processArgs(String[] args) {
        Option fizzOpt = OptionBuilder
            .withArgName("fizz")
            .withLongOpt("fizz")
            .hasArg()
            .withDescription("The fizz argument.")
            .create("fizz");

        Option buzzOpt = OptionBuilder
            .withArgName("buzz")
            .withLongOpt("buzz")
            .hasArg()
            .withDescription("The buzz argument.")
            .create("buzz");

        cmdLineOpts.addOption(fizzOpt);
        cmdLineOpts.addOption(buzzOpt);

        CommandLine cmdLine;

        try {
            cmdLine = cmdLineParser.parse(cmdLineOpts, args);

            // Expecting to get a value of "Alright, then!"
            String fizz = cmdLine.getOptionValue("fizz");
            System.out.println("Fizz is: " + fizz);
        } catch(ParseException parseExc) {
            helpFormatter.printHelp("myapp", cmdLineOpts, true);
            throw parseExc;
        }
    }
}
当我运行此命令时,会得到以下输出:

嘶嘶声为:空

我需要对我的代码做什么才能以我希望的方式调用我的应用程序?或者我最接近它的是什么

奖励点:如果有人能向我解释一下
OptionBuilder
与argname(…)
与longopt(…)
create(…)
参数之间的区别,因为我正在为它们传递相同的值,如下所示:

Option fizzOpt = OptionBuilder
    .withArgName("fizz")
    .withLongOpt("fizz")    }   Why do I have to pass the same value in 3 times to make this work?!?
    .create("fizz");
首先,OptionBuilder上的
.hasArg()
告诉它,您希望在参数标志之后有一个参数

我让它和这个命令行一起工作

--fizz "VicFizz is good for you" -b "VicBuzz is also good for you"
使用以下代码-我将其放入构造函数中

Option fizzOpt = OptionBuilder
        .withArgName("Fizz")
        .withLongOpt("fizz")
        .hasArg()
        .withDescription("The Fizz Option")
        .create("f");

cmdLineOpts.addOption(fizzOpt);
cmdLineOpts.addOption("b", true, "The Buzz Option");
细分

选项设置是必要的,以便在命令行上提供更高的可用性,以及更好的使用信息(见下文)

  • .withArgName(“Fizz”)
    :在用法中为您的参数提供一个很好的标题 (见下文)
  • .withLongOpt(“fizz”)
    :允许
    --fizz“VicFizz对您有好处”
  • .create(“f”)
    :是主参数,允许 命令行
    -f“VicFizz对您有好处”
  • 请注意,对于 fuzz的构造要简单得多,在构建过程中牺牲了可读性 用法
使用信息

就我个人而言,我喜欢打印出良好用法的CLI程序。您可以使用
帮助格式化程序
执行此操作。例如:

private void processArgs(String[] args) {
  if (args == null || args.length == ) {
    helpFormatter.printHelp("Don't you know how to call the Fizz", cmdLineOpts);
    ...
这将打印一些有用的内容,如:

usage: Don't you know how to call the Fizz
  -b <arg>          The Buzz Option
  -f,--fizz <Fizz>  The Fizz Option
用法:难道你不知道怎么叫汽水吗
-b嗡嗡声选项
-f、 --嘶嘶声嘶嘶声选项
请注意短选项
-f
、长选项
--fizz
、名称
以及描述是如何显示的

希望这有帮助

1)您的代码没有编译(缺少一个分号,没有声明异常)。2) 对我来说这很有效。我得到的预期的
嘶嘶声是:好吧,那么。谢谢@Seelenvirtuose(+1)-很抱歉我添加了分号(复制粘贴错误)。你说这对你有用?你能粘贴你正在使用的命令行调用吗?再次感谢!