Как передать (и после получения) массив параметров с помощью Commons CLI?

#java #command-line #command-line-interface #command-line-arguments

#java #командная строка #интерфейс командной строки #аргументы командной строки

Вопрос:

У меня есть следующий код:

 options.addOption(OptionBuilder.withLongOpt(SOURCES)
                .withDescription("path to sources")
                .hasArg()
                .withArgName("PATHS")
                .create());
...
CommandLineParser parser = new GnuParser();
line = parser.parse(options, args);
...
System.out.println(line.getOptionValues(SOURCES));
  

Я вызываю приложение с параметрами

 -sources=path1, path2
  

в результате я вижу ["path1"]

Я хочу получить оба аргумента. Как я могу это передать?

что я должен написать в командной строке

Ответ №1:

Сделайте значения аргументов разделенными пробелами, а не разделенными запятыми:

 -source=path1 path2
  

Кроме того, вам нужно использовать .hasArgs() , а не .hasArg() возвращать более одного значения аргумента. Вы также можете указать .hasArgs(2) явное количество значений аргументов. Вот рабочий пример:

Ввод: -источник = путь 1 путь 2

 public class Test {

    public static void main(String[] args) {
        Options options = new Options();
        options.addOption(OptionBuilder.withLongOpt("sources").withDescription("path to sources").hasArgs().withArgName("PATHS").create());

        CommandLineParser parser = new GnuParser();
        CommandLine line = null;

        try {
            line = parser.parse(options, args, true);
        } catch (ParseException exp) {
            System.err.println("Parsing failed.  Reason: "   exp.getMessage());
        }

        System.out.println(Arrays.toString(line.getOptionValues("sources")));
    }
}
  

Вывод: [путь 1, путь 2]

Комментарии:

1. строка.getOptionValues(примечание s)

2. Я опубликовал рабочий пример с дополнительными объяснениями.

Ответ №2:

Если вы хотите передать массив, вы должны заменить hasArg() на hasArgs() , чтобы указать, что параметр может иметь несколько значений. Теперь вы можете передать их следующим образом:

 -sources path1 path2
  

Если вы хотите иметь возможность передавать их через запятую, вы можете вызвать withValueSeparator(',') your OptionBuilder , в результате чего получится код, подобный следующему:

 options.addOption(OptionBuilder.withLongOpt(SOURCES)
    .withDescription("path to sources")
    .hasArgs()
    .withValueSeparator(',')
    .withArgName("PATHS")
    .create());
  

Теперь вы можете передать их таким образом:

 -sources path1,path2
  

Однако имейте в виду, что пробел все равно будет обрабатываться как разделитель.