web-dev-qa-db-fra.com

Apache Commons CLI: Obtention de la liste de valeurs pour une option

Pour une interface de ligne de commande, j'ai l'obligation de transmettre un tableau d'ints en tant qu'entrée pour une option particulière. 

Exemple - La commande ci-dessous prendrait un tableau de customerIds et effectuera certaines opérations.

myCommand -c 123 124 125

J'ai implémenté la CLI à l'aide de la CLI commune Apache et j'utilise getOptionValues ​​("c") pour récupérer ce tableau. 

Le problème est que cela ne renvoie que le premier élément du tableau, à savoir [123], alors que je m'attends à ce qu'il retourne [123, 124, 125]. 

Une version condensée de mon code, 

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
}

Quelqu'un peut-il m'aider à identifier le problème ici?

26
Gautham Reddy

Vous devez définir au maximum le nombre de valeurs d'argument pouvant être prises par l'option, sinon l'hypothèse suppose que l'option ne possède qu'une valeur d'argument.

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

J'aimerais ajouter ceci ici comme réponse à @Zangdak et ajouter mes découvertes sur le même problème.

Si vous n'appelez pas #setArgs(int), une exception RuntimeException se produira. Lorsque vous connaissez le nombre maximal exact d'arguments pour cette option, définissez cette valeur spécifique. Lorsque cette valeur n'est pas connue, la classe Option a une constante pour celle-ci: Option.UNLIMITED_VALUES

Cela changerait la réponse des gerrytans aux éléments suivants:

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

Il semble que je sois un peu en retard pour le parti mais Apache commons cli a évolué et maintenant (au moins en 1.3.1) nous avons une nouvelle façon de définir qu'il peut y avoir un nombre illimité d'arguments

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

Vous devez spécifier deux paramètres setArgs et setValueSeparator. Ensuite, vous pouvez passer une liste d’arguments comme -k=key1,key2,key3.

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