it-swarm.com.de

Apache Commons CLI: Liste der Werte für eine Option abrufen

Für eine CLI muss ich ein Array von Ints als Eingabe für eine bestimmte Option übergeben. 

Beispiel - Der folgende Befehl würde ein Array von customerIds aufnehmen und einige Operationen ausführen.

myCommand -c 123 124 125

Ich habe die CLI mit Apache Commons CLI implementiert und verwende getOptionValues ​​("c"), um dieses Array abzurufen. 

Das Problem ist, dass dies nur das erste Element in dem Array zurückgibt, d. H. [123], während ich erwarte, dass es zurückkehrt [123, 124, 125]. 

Eine komprimierte Version meines Codes 

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
}

Kann mir jemand helfen, das Problem hier zu identifizieren?

26
Gautham Reddy

Sie müssen die Anzahl der Argumentwerte festlegen, die die Option annehmen kann. Andernfalls wird davon ausgegangen, dass die Option nur einen Argumentwert hat

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

Ich möchte dies hier als Antwort auf @Zangdak hinzufügen und meine Ergebnisse zum gleichen Problem hinzufügen.

Wenn Sie #setArgs(int) nicht aufrufen, tritt eine RuntimeException auf. Wenn Sie die genaue maximale Anzahl von Argumenten für diese Option kennen, legen Sie diesen bestimmten Wert fest. Wenn dieser Wert nicht bekannt ist, hat die Klasse Option eine Konstante: Option.UNLIMITED_VALUES

Dies würde die Antwort von gerrytans auf Folgendes ändern:

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

Anscheinend bin ich etwas spät dran, aber Apache commons cli hat sich weiterentwickelt, und jetzt (zumindest in 1.3.1) haben wir eine neue Möglichkeit, festzulegen, dass es eine unbegrenzte Anzahl von Argumenten geben kann

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

Sie müssen zwei Parameter setArgs und setValueSeparator angeben. Dann können Sie eine Liste von Argumenten wie -k=key1,key2,key3 übergeben.

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