25

Ich schreibe Befehlszeilenanwendung in Java und ich habe Apache Commons CLI gewählt, um Eingabeargumente zu analysieren.Commons CLI erforderliche Gruppen

Nehmen wir an, ich habe zwei erforderliche Optionen (dh. -Input und -output). Ich erstelle ein neues Option-Objekt und setze das erforderliche Flag. Für jetzt ist alles gut. Aber ich habe dritte, nicht erforderliche Option, dh. -Hilfe. Mit den Einstellungen, die ich erwähnt habe, wenn der Benutzer Hilfe anzeigen möchte (benutze die Option -help), heißt es "-input and -output" sind erforderlich. Gibt es eine Möglichkeit, dies zu implementieren (über Commons CLI API, nicht einfach, wenn (! HasOption) neue XXXException()) werfen.

Antwort

27

In diesem Fall müssen Sie zwei Optionen definieren und die Befehlszeile zweimal analysieren. Der erste Satz von Optionen enthält die Optionen, die der erforderlichen Gruppe vorangehen (normalerweise --help und --version), und der zweite Satz enthält alle Optionen.

Sie beginnen mit dem Parsen der ersten Reihe von Optionen, und wenn keine Übereinstimmung gefunden wird, fahren Sie mit der zweiten Gruppe fort. Hier

ein Beispiel:

Options options1 = new Options(); 
options1.add(OptionsBuilder.withLongOpt("help").create("h")); 
options1.add(OptionsBuilder.withLongOpt("version").create()); 

// this parses the command line but doesn't throw an exception on unknown options 
CommandLine cl = new DefaultParser().parse(options1, args, true); 

if (!cl.getOptions().isEmpty()) { 

    // print the help or the version there. 

} else { 
    OptionGroup group = new OptionGroup(); 
    group.add(OptionsBuilder.withLongOpt("input").hasArg().create("i")); 
    group.add(OptionsBuilder.withLongOpt("output").hasArg().create("o")); 
    group.setRequired(true); 

    Options options2 = new Options(); 
    options2.addOptionGroup(group); 

    // add more options there. 

    try { 
     cl = new DefaultParser().parse(options2, args); 

     // do something useful here. 

    } catch (ParseException e) { 
     // print a meaningful error message here. 
    } 
} 
+0

Ok. Aber wie kann ich sagen, dass ich das Spiel nicht gefunden habe? ("und wenn keine Übereinstimmung gefunden wird")? Wenn ich das erforderliche Flag setze, bekomme ich ParseExeception, aber wenn ich eine Option übergebe, die nicht verfügbar ist, bekomme ich auch ParseException :(Wie kann ich diese Fälle unterscheiden? – pavel

+0

Sie wissen, ob Sie eine Übereinstimmung gefunden haben, wenn 'commandline.getOptions()' isn ' t leer –

+0

Ok Es ist eine mögliche Lösung, aber was ist mit der Handhabung nicht unterstützter Optionen? Verfügbare Optionen sind -help, -input, -output. Benutzer puts -test. Dann muss ich zuerst überprüfen (mit Hilfe) um festzustellen, ob Hilfe gefunden oder nicht.Wenn nicht oder UnrecognizedOptionException ausgelöst wurde, dann muss ich zweite Reihe von Optionen analysieren? So einfach versuchen {parsefirstSet() if (not_found) parseSecondSet() catch (ParserException) {parseSecondSet()}? Bin ich etwas fehlt oder es ist das, was Sie vorgeschlagen haben.Thanks für Hilfe btw :) – pavel

Verwandte Themen