it-swarm.dev

Apache Commons CLI: Bir seçenek için değerlerin listesini alma

Bir CLI için, belirli bir seçenek için girdi olarak bir dizi dizgiyi geçme gereksinimim var. 

Örnek - Aşağıdaki komut bir müşteri kimliği dizisine girer ve bazı işlemleri gerçekleştirir.

myCommand -c 123 124 125

CLI'yi Apache commons CLI'yi kullanarak uyguladım ve bu diziyi almak için getOptionValues ​​("c") kullanıyorum. 

Sorun şu ki, dizideki yalnızca ilk öğeyi, yani [123] döndürüyor, geri dönmesini beklerken [123, 124, 125]. 

Kodumun yoğunlaştırılmış bir sürümü, 

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
}

Birisi sorunu burada tanımlamama yardımcı olabilir mi?

26
Gautham Reddy

Seçeneğin alabileceği maksimum argüman değeri sayısını ayarlamanız gerekir, aksi halde seçeneğin yalnızca 1 argüman değeri olduğunu varsayar

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);
31
gerrytan

Bunu buraya @Zangdak'a bir cevap olarak eklemek ve bulgularımı aynı sorun üzerine eklemek istiyorum.

#setArgs(int) işlevini çağırmazsanız, bir RuntimeException oluşacaktır. Bu seçeneğe tam olarak maksimum argüman miktarını biliyorsanız, o zaman bu belirli değeri ayarlayın. Bu değer bilinmediğinde, Option sınıfı bunun için bir sabite sahiptir: Option.UNLIMITED_VALUES

Bu, gerrytanların aşağıdakilere cevap vermesini değiştirir:

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);
37
VeikkoW

Partiye biraz geç kaldım gibi görünüyor ama Apache commons cli gelişti ve şimdi (en azından 1.3.1'de) sınırsız sayıda argüman olabileceğini belirlemenin yeni bir yolunu bulduk

Option c = Option.builder("c")
        .hasArgs() // sets that number of arguments is unlimited
        .build();
        Options options = new Options();
        options.addOption(c);
6
David Michael Gang

setArgs ve setValueSeparator adlı iki parametreyi belirtmeniz gerekir. Ardından -k=key1,key2,key3 gibi bir argüman listesi iletebilirsiniz.

Option option = new Option("k", "keys", true, "Description");
// Maximum of 10 arguments that can pass into option
option.setArgs(10);
// Comma as separator
option.setValueSeparator(',');
0
ReaktorDTR