1

在此处使用Apache Commons CLI 1.2。我有一个需要 2 个运行时选项的可执行 JAR,fizz并且buzz;两者都是需要参数/值的字符串。我希望如果可能的话)我的应用程序像这样执行:

java -jar myapp.jar -fizz "好吧,那么!" -buzz “现在保重,那么再见!”

在这种情况下,fizz选项的值将是“ Alrighty,then! ”等。

这是我的代码:

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如果有人可以向我解释'swithArgName(...)和参数之间的区别withLongOpt(...)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");
4

1 回答 1

3

首先.hasArg(),您的 OptionBuilder 上的 告诉它您希望在参数标志之后有一个参数。

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

--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 is good for you"
  • .create("f"): 是主要参数,允许命令行-f "VicFizz is good for you"
  • 请注意,用于模糊的选项 b 构建得更简单,在使用过程中牺牲了可读性

使用信息

我个人喜欢打印出很好用法的 CLI 程序。您可以使用HelpFormatter. 例如:

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

请注意如何显示短选项-f、长选项--fizz和名称<Fizz>以及描述。

希望这可以帮助

于 2015-05-08T15:22:54.070 回答