2013-06-18 65 views
25

對於CLI,我需要傳入一個ints數組作爲特定選項的輸入。Apache Commons CLI:獲取選項的值列表

示例 - 以下命令將採用一個customerIds數組並執行一些操作。

mycommand的-c 123 124 125

我已經使用Apache公地CLI實現的CLI,並我使用getOptionValues( 「C」)來檢索這個陣列。

問題是,這只是返回數組中的第一個元素,即[123],而我期待它返回[123,124,125]。

我的代碼的精簡版,

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 
} 

有人能幫助我在這裏找到問題?

回答

24

你必須設置最大參數的數量值的選​​項可以拿,否則假定選項只有1個參數值

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

如果參數值的最大數量是未知的數量限制?是否有可能與\t括號有句法? – Zangdak

31

我想在這裏添加爲一個答案@Zangdak並在同一問題上添加我的發現。

如果您沒有撥打#setArgs(int),則會發生RuntimeException。當您知道此選項的參數的確切最大數量時,請設置此特定值。當這個值是不知道,類選項都是有常數:Option.UNLIMITED_VALUES

這將改變gerrytans回答如下:

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

是的,這是我做的,但我想要得到一個語法如下:'cmd -opt1 {V1 V2 ... Vn} arg'但它似乎不存在,所以我只是將參數放在選項之前無限的價值。 – Zangdak

+1

@Zangdok如果我正確地理解了你,並將我帶入相同的問題,UNLIMITED_VALUES在所有這些值之後都有另一個選項是沒有問題的。 我可以證實,像'cmd --opt = {V1 V2 ... Vn} -o --debug'這樣的東西正在工作 – VeikkoW

+0

不,在無限值的選項之後的另一個選項效果很好。我想在這樣的選擇之後有一個論點。無論如何,我會嘗試你的語法。 – Zangdak

5

它看起來像我有點遲到了黨,但阿帕奇公共CLI(至少在1.3.1)演變而來,現在我們有一種新的方式來設置,有可能的論點

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

如果你調用hasArgs(),那麼hasArg()調用是冗餘的 – jnowakow

相關問題