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


  java -jar myapp.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;
        }
    }
}


运行此命令时,将得到以下输出:


  嘶嘶响为:null


我需要对我的代码做些什么,以便可以按我希望的方式调用我的应用程序?或者我能找到的最接近的是什么?

优点:如果有人可以向我解释OptionBuilderwithArgName(...)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");

最佳答案

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

我可以在此命令行下使用

--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>以及说明。

希望这可以帮助

关于java - Commons CLI不遵守我的命令行设置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30125397/

10-09 18:18