2013-06-18 22 views
25

Dla CLI, mam wymóg przekazania tablicy int jako danych wejściowych dla konkretnej opcji.Apache Commons CLI: Pobieranie listy wartości dla opcji

Przykład - Komenda poniżej pobierze tablicę identyfikatorów klientów i wykona pewne operacje.

MyCommand C 123 124 125

I realizowane CLI pomocą Apache commons numeru, ja pomocą getOptionValues ​​("C"), aby odzyskać tę tablicę.

Problem polega na tym, że zwraca tylko pierwszy element w tablicy, tj. [123], podczas gdy oczekuję, że zwróci [123, 124, 125].

wersji skróconej mojego kodu,

CommandLine cmd; 
CommandLineParser parser = new BasicParser(); 
cmd = parser.parse(options, args); 
if (cmd.hasOption("c")){ 
String[] customerIdArray = cmd.getOptionValues("c"); 
// Code to parse data into int 
} 

Czy ktoś może mi pomóc zidentyfikować problem tutaj?

Odpowiedz

24

Musisz ustawić maksymalną liczbę argumentów wartości opcja może potrwać, w przeciwnym razie zakłada opcja ma jedynie wartość 1 argumentu

Options options = new Options(); 
Option option = new Option("c", "c desc"); 
// Set option c to take maximum of 10 arguments 
option.setArgs(10); 
options.addOption(option); 
+3

A jeśli maksymalna liczba wartości argumentów jest nieznana? Czy można mieć składnię ze wspornikiem \t? – Zangdak

31

chciałbym dodać to tutaj jako odpowiedź na @Zangdak i dodać moje wnioski dotyczące tego samego problemu.

Jeśli nie zadzwonisz pod numer #setArgs(int), nastąpi wyjątek RuntimeException. Kiedy znasz dokładną maksymalną liczbę argumentów dla tej opcji, ustaw tę konkretną wartość. Gdy wartość ta nie jest znana, Option klasa ma stały dla niego: Option.UNLIMITED_VALUES

To zmieniłoby gerrytans odpowiedzieć na następujące kwestie:

Options options = new Options(); 
Option option = new Option("c", "c desc"); 
// Set option c to take 1 to oo arguments 
option.setArgs(Option.UNLIMITED_VALUES); 
options.addOption(option); 
+0

Tak, to co zrobiłem, ale chciałem uzyskać składnię bardziej podobną do następującej: 'cmd -opt1 {V1 V2 ... Vn} arg' ale wydaje się, że nie istnieje, więc po prostu umieszczam argumenty przed opcjami z nieograniczone wartości. – Zangdak

+1

@Zangdok Jeśli rozumiem cię poprawnie, co zabrało mnie do tego samego pytania, nie ma problemu dla UNLIMITED_VALUES mieć inną opcję po wszystkich tych wartościach. Mogę potwierdzić, że coś takiego jak 'cmd --opt = {V1 V2 ... Vn} -o --debug' działa – VeikkoW

+0

Nie, inna opcja po opcji z nieograniczonymi wartościami działa dobrze. Chciałem mieć argument po takiej opcji. W każdym razie spróbuję twojej składni. – Zangdak

5

Wygląda na to jestem trochę późno na imprezę, ale apache commons cli ewoluował i teraz (przynajmniej w wersji 1.3.1) mamy nowy sposób na ustalenie, że może istnieć nieograniczona liczba argumentów:

Option c = Option.builder("c") 
     .hasArgs() // sets that number of arguments is unlimited 
     .build(); 
     Options options = new Options(); 
     options.addOption(c); 
+1

Jeśli wywołasz hasArgs(), to hasArg() wywołanie jest nadmiarowe – jnowakow

Powiązane problemy