2015-05-08 2 views
1

Используя Apache Commons CLI 1.2 здесь. У меня есть исполняемый JAR, который должен взять 2 варианта времени исполнения, fizz и buzz; обе строки, которые требуют аргументов/значений. Я бы как (если это вообще возможно) мое приложение будет выполняться следующим образом:Commons CLI не выполняет настройки моей командной строки

ява -jar MyApp.jar -fizz "Alrighty, тогда!" -Будз: «Позаботьтесь, до свидания!»

В этом случае значение для параметра fizz будет "Alrighty, то!" И т.д.

Вот мой код:

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; 
     } 
    } 
} 

Когда я запускаю это я получаю следующий вывод:

Fizz является: нулевой

Что мне нужно сделать для моего кода, чтобы мое приложение могло быть вызвано так, как я его хочу? Или, что ближе, я могу добраться до него?

Бонусные баллы: Если кто-то может объяснить мне разницу между withArgName(...), withLongOpt(...) и create(...) аргументов OptionBuilder «s, так как я прохожу в том же значении для них все, как так:

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"); 
+1

1) Ваш код не компилируется (один отсутствующая точка с запятой, не декларируются исключения). 2) Для меня это работает. Я получаю ожидаемый «Fizz: Alrighty, then!». – Seelenvirtuose

+0

Спасибо @Seelenvirtuose (+1) - извините за запятую (копия n пасты), я добавил ее. Вы говорите, что это работает на вас? Можете ли вы вставить точный вызов командной строки, который вы используете? Еще раз спасибо! – smeeb

ответ

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 для fuzz был построен намного проще, облегчая читаемость во время использования

Использование Сообщение

Лично я люблю 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>, наряду с описанием.

Надеется, что это помогает