Ich weiß, dass diese Frage bereits gestellt wurde, aber ich suche nach Java-CLI-Parser mit einer bestimmten Funktionalität. Ich möchte, dass es in der Lage ist, den Befehlszeilenbaum zu definieren, also Unterbefehle (und mehr als eine Ebenentiefe). So kann ich 3-4 Level von Befehlen haben, bevor ich zu den Optionen komme. Und diese Unterbefehle schließen sich gegenseitig aus. Danke
Kann mit JCommander gemacht werden. Jedes JCommander
-Objekt ist im Wesentlichen ein Befehl mit einer beliebigen Anzahl von Parametern und / oder einer beliebigen Anzahl verschachtelter Unterbefehle, wobei das oberste JCommander
-Objekt der root -Befehl ist. Befehlsparameter sind immer spezifisch für den Befehl, für den sie deklariert wurden und stören nicht die Parameter anderer Befehle. Die Schnittstelle zum Hinzufügen eines Unterbefehls ist nicht sehr intuitiv, aber möglich (siehe addCommand
method ())
Hier ist eine Proof-of-Concept-Testklasse:
%Vor%Bearbeiten: Wie man Befehle wieder verwendet.
Lösung 1, verwenden Sie Vererbung:
%Vor%Ich denke, dass die Verwendung und das Verhalten für diesen Fall offensichtlich sind. Der einzige Nachteil ist, dass Sie nur von einer Klasse, die kann die Wiederverwendbarkeit in der Zukunft einschränken.
Lösung 2, Verwenden des Kompositionsmusters (siehe Dokument hier ):
%Vor% Hier werden die verschachtelten commonArgs
-Klassen-Parameter so behandelt, als wären sie direkte Parameter der Befehlsklasse. Sie können so viele Delegierte hinzufügen, wie Sie möchten, oder sogar Delegaten in andere Delegaten verschachteln und so weiter. Um den Wert der delegierten Option nach dem Parsen zu erhalten, tun Sie einfach myCommand1.commonArgs.isCommonOpt
, etc.
picocli unterstützt geschachtelte Unterbefehle in beliebiger Tiefe.
%Vor%Sie können auch die Verwendung der Hilfe mit ANSI-Stilen und Farben mögen.
Beachten Sie, dass die Verwendungshilfe die registrierten Unterbefehle zusätzlich zu Optionen und Positionsparametern auflistet.
Die Verwendungshilfe kann einfach mit Anmerkungen angepasst werden.
Ich denke, es wird besser sein, diese mehrstufigen Befehle in mehrere CLI-Tools aufzuteilen.
Anstelle von:
program cmd sub-cmd sub-sub-cmd -option1 argument -option2 argument
Fügen Sie dem Programmnamen eine oder zwei Ebenen hinzu:
program-cmd-sub-cmd sub-sub-cmd -option1 argument -option2 argument
Beispiel für ein echtes Wort:
svn-add -q -N foo.c
Sie können alle erforderlichen Klassen in einem einzigen JAR behalten (und sie beliebig oft wiederverwenden), fügen Sie einfach mehrere "Haupt" -Eintrittspunkte hinzu. Für grundlegende CLI-Analyse empfehle ich auch JCommander
.
Tags und Links java command-line-interface subcommand