2013-08-20 3 views
3

Я использую Common CLI для личного проекта. Одна вещь, которую я не нашел в документации, заключается в том, как обеспечить соблюдение определенного аргумента для представления.Apache Common CLI: Как добавить аргументы?

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

mycommand file.txt -b 2 

mycommand is the command, 
file.txt is the argument 
-b 2 is the option where 2 is the option value 

С Common CLI, я могу добавить -b 2 в качестве опции, как это:

options.addOption("b", true, "Some message"); 

и проанализировать аргументы с помощью:

CommandLineParser commandParser = new GnuParser(); 
CommandLine result = commandParser.parse(options, args) 

, но как я могу указать file.txt также требуется?

Большое спасибо

ответ

1

EDIT: Я не понял, вы имели в виду сделать цель (не вариант), который будет необходимо.

Если вы используете метод полного разбора CommandLineParser.parse(Options, String[], boolean) с необязательным флагом, установленным в false, тогда анализатор пропустит неизвестные аргументы.

Вы можете позже получить их с помощью метода getArgs() который возвращает String []

Вы можете пройти через эти строки, чтобы убедиться, что есть строка называется file.txt

Options options = new Options(); 

options.addOption("b", true, "some message"); 

String[] myArgs = new String[]{"-b","2", "file.txt"}; 
CommandLineParser commandParser = new GnuParser(); 

CommandLine commandline = commandParser.parse(options, myArgs, false); 

System.out.println(Arrays.toString(commandline.getArgs())); 

напечатает [file.txt] на экран.

так добавить дополнительную проверку, чтобы найти через этот массив, чтобы найти все необходимые задачи:

boolean found=false; 
for(String unparsedTargets : commandline.getArgs()){ 
    if("file.txt".equals(unparsedTargets)){ 
     found =true; 
    } 
} 
if(!found){ 
    throw new IllegalArgumentException("must provide a file.txt"); 
} 

Я согласен, что это грязно, но я не думаю, что CLI обеспечивает чистый способ сделать это.

1

Нет, невозможно использовать текущий API, но я думаю, что вы можете расширять GnuParser своей собственной реализацией Parser.parse(), если обязательное имя параметра EVER file.txt.
Иначе, если имя файла может измениться, вы можете переопределить Parser.processArgs() (для опций не аргументы, ваше имя файла, я имею в виду) и Parser.processOption() (для установки флага указано, что вы нашли действительный вариант): если вы введете Parser.processArgs(), когда установлен флаг вы нашли недопустимое неназванный ARG)

public class MyGnuParser extends GnuParser { 

    private int optionIndex; 
    private String filename; 

    public MyGnuParser() { 
     this.optionIndex = 0; 
     this.filename = null; 
    } 

public CommandLine parse(Options options, String[] arguments, Properties properties) throws ParseException { 
     CommandLine cmdLine = super.parse(options, arguments, properties, false); 
     if(this.filename == null) throw new ParseException(Missing mandatory filename argument); 
    } 

    @Override 
    public void processArgs(Option opt, ListIterator iter) throws ParseException { 
     super.processArgs(opt, item); 
     ++this.optionIndex; 
    } 

    @Override 
    protected void processOption(final String arg, final ListIterator iter) throws ParseException { 
     if(this.optionIndex > 0) { 
     throw new ParseException(non-opt arg must be the first); 
     } 
     if(this.filename != null) { 
     throw new ParseException(non-opt invalid argument); 
     } 
     this.filename = arg; 
     ++this.optionIndex; 
    } 
} 

MyGnuParser p = new MyGnuParser(); 
CommandLine cmdLine = p.parse(options, args, properties); 

и p.filename (или cmdLine.getArgs[0]), вы можете получить имя файла.

Это не интуитивно, но с CLI API. Я не знаю другого способа.

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