#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
Однако имейте в виду, что пробел все равно будет обрабатываться как разделитель.