2013-06-18 9 views
25

Per una CLI, ho il requisito di passare una serie di valori come input per un'opzione particolare.Apache Commons CLI: Ottenere l'elenco dei valori per un'opzione

Esempio: il comando seguente include una serie di customerId ed esegue alcune operazioni.

myCommand -c 123 124 125

Ho implementato il CLI usando Apache Commons CLI, e sto usando getOptionValues ​​("c") per recuperare questo array.

Il problema è che questo restituisce solo il primo elemento dell'array, ad esempio [123], mentre mi aspetto che restituisca [123, 124, 125].

una versione condensata di mio codice,

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 
} 

Qualcuno può aiutarmi a identificare il problema qui?

risposta

24

è necessario impostare massimo il numero di argomenti valorizza l'opzione può prendere, altrimenti si assume l'opzione ha solo valore 1 argomento

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

E se il numero massimo di valori argomento è sconosciuto? È possibile avere una sintassi con la parentesi \t? – Zangdak

31

vorrei aggiungere questo qui come una risposta a @Zangdak e aggiungere le mie scoperte sullo stesso problema.

Se non si chiama #setArgs(int), si verificherà una RuntimeException. Quando conosci l'esatta quantità massima di argomenti per questa opzione, imposta questo valore specifico. Quando questo valore non è noto, l'opzione di classe ha una costante per esso: Option.UNLIMITED_VALUES

Questo cambierebbe gerrytans risposta alla seguente:

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

Sì, quello che ho fatto ma volevo ottenere una sintassi più simile alla seguente: 'cmd -opt1 {V1 V2 ... Vn} arg' ma sembra che non esistano quindi ho appena posto gli argomenti prima delle opzioni con valori illimitati. – Zangdak

+1

@Zangdok Se ho capito bene, che mi ha portato alla stessa domanda, non è un problema per UNLIMITED_VALUES avere un'altra opzione dopo tutti quei valori. Posso confermare che qualcosa come 'cmd --opt = {V1 V2 ... Vn} -o --debug' sta funzionando – VeikkoW

+0

No, un'altra opzione dopo che un'opzione con valori illimitati funziona bene. Volevo avere un argomento dopo tale opzione. Ad ogni modo, proverò la tua sintassi. – Zangdak

5

sembra che io sono un po 'tardi per il partito, ma apache commons cli evoluto e ora (almeno in 1.3.1) abbiamo un nuovo modo di impostare che ci può essere un numero illimitato di argomenti

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

Se si sta chiamando hasArgs(), la chiamata hasArg() è ridondante – jnowakow