2015-10-26 3 views
2

Пытается использовать Apache Commons Command Line Interface 1.3.1from here Он отлично работает для требуемых аргументов, но, похоже, упускает любые необязательные аргументы. Может ли кто-нибудь выявить проблему с моим кодом ниже?Java Apache CLI Опция командной строки Аргументы не работают

import org.apache.commons.cli.CommandLine; 
import org.apache.commons.cli.CommandLineParser; 
import org.apache.commons.cli.DefaultParser; 
import org.apache.commons.cli.Option; 
import org.apache.commons.cli.Options; 
import org.apache.commons.cli.ParseException; 

public class TestCommandLine { 

    public static void main(String[] args) { 

     // ***** test with command line arguments -R myfirstarg -O mysecondarg ***** 
     // ***** the second arg is not being captured       ***** 

     System.out.println("Number of Arguments : " + args.length); 

     String commandline = ""; 
     for (String arg : args) { 
      commandline = commandline + (arg + " "); 
     } 
     commandline.trim(); 
     System.out.println("Command-line arguments: " + commandline); 

     // create Options object 
     Options options = new Options(); 
     options.addOption("R", true, "Enter this required argument"); 
     Option optionalargument = Option.builder("O") 
       .optionalArg(true) // if I change this line to .hasArg(true) it works, but then is not optional 
       .desc("Enter this argument if you want to") 
       .build(); 
     options.addOption(optionalargument); 

     // initialize variables used with command line arguments 
     String firstargument = null; 
     String secondargument = null; 


     CommandLineParser parser = new DefaultParser(); 
     try { 
      // parse the command line arguments 
      CommandLine cmd = parser.parse(options, args); 

      firstargument = cmd.getOptionValue("R"); 
      secondargument = cmd.getOptionValue("O"); 

      if(cmd.hasOption("R")){ 
       if(firstargument == null){ 
        System.out.println("Must provide the first argument ... exiting..."); 
        System.exit(0); 
       } 
       else { 
        System.out.println("First argument is " + firstargument); 
       } 
      } 
      if(cmd.hasOption("O")) { 
       // optional argument 
       if (secondargument == null){ 
        System.out.println("Second argument is NULL"); 
       } 
       else{ 
        // should end up here if optional argument is provided, but it doesn't happen 
        System.out.println("Second argument is " + secondargument); 
       } 
      } 

     } 
     catch(ParseException exp) { 
      // oops, something went wrong 
      System.err.println("Parsing failed. Reason: " + exp.getMessage()); 
     } 
    } 

} 

Выход из приведенного выше кода:

Number of Arguments : 4 
Command-line arguments: -R myfirstarg -O mysecondarg 
First argument is myfirstarg 
Second argument is NULL 

Почему не "mysecondarg" захвата? Если я изменяю строку .optionalArg (true) на .hasArg (true), тогда второй аргумент захватывается, но вся идея состоит в том, чтобы иметь возможность опционально оставить второй аргумент.

+0

Что делать, если вы установите для него количество аргументов? – ohshazbot

+0

@ohshazbot: не уверен, что я следую этому вопросу, но если я укажу, что аргумент должен быть предоставлен для опции -O, тогда код работает - до тех пор, пока пользователь предоставляет аргумент. Но в реальном приложении пользователь должен иметь возможность выбирать -O, а затем необязательно либо предоставлять аргумент, либо нет. – BunkerBob

+0

В построителе есть дополнительный флаг, который не задает, если есть/не являются аргументами, но для установки числа аргументов. Это numberOfArgs – ohshazbot

ответ

3

Кажется, вам нужно установить numberOfArgs в дополнение к hasOptionalArgs, чтобы он работал правильно.

0

Существует еще один метод parse(), который принимает третий параметр param, называемый stopAtNonOption.

Установка stopAtNonOption на false приведет к сбою синтаксического анализа и выдаче и исключению при достижении неизвестного параметра.

Я выяснил, что синтаксический анализатор останавливает синтаксический анализ, когда он достигает неизвестного параметра.

 Смежные вопросы

  • Нет связанных вопросов^_^