Ich schreibe eine Shell in Java, weil ich schon viel zu lange nicht mehr in Java programmiert und vieles davon vergessen habe. Ich wollte meinen eigenen schreiben, aber im Moment hätte ich gerne einen funktionierenden Prototyp, also würde ich gerne einen vorhandenen Befehlszeilen-Optionsparser einfügen.
Anforderungen:
String
oder String[]
(dh verwendet nicht die Argumente von der Befehlszeile)getopt
(die erweiterte GNU-Version); speziell:
-a -b -c
bis -abc
)--message="Hello!"
) (obwohl es keine langen Optionen mit einem Bindestrich unterstützen muss)-abc --long="Hello!" param1 param2
sagt mir, dass die Parameter param1
und sind param2
) .--
kann verwendet werden, um Optionen von Argumenten zu trennen (z. B. -ab --custom="hello" -- -file_starting_with_hyphen -another
gibt mir die Optionen/Flags a
, b
, und custom
mit den entsprechenden Werten und sagt mir, dass die Argumente -file_starting_with_hyphen
und sind -another
)-h foo
sagt, dass es eine Option gibt, h
, mit einem Wert, foo
)String
oder String[]
und es sagt mir, welche Flags/Optionen gesetzt wurden, im Gegensatz zu der Suche nach den Optionen, die ich setzen möchte, und der Annahme, dass der Rest Argumente sind )
Ideal, aber nicht notwendig:
java.util.Map
speziell ), um Daten zurückzugeben. (So kann ich später leichter meine eigene Funktion schreiben)Sie könnten sich FeSimpleArgs ansehen
Ich glaube, es erfüllt alle Ihre Anforderungen:
Konzept: Ein sehr leichter Kommandozeilen-Parser. Akzeptiert Argumente entweder in der Form String oder String[], gibt eine Klasseninstanz zurück, die die Argumente in einer Zuordnung und die Parameter in einer Liste enthält.
Anforderungen:
Ein Optionsname gefolgt von einem Wert wird als die Option mit diesem Wert geparst (z. B. -h foo sagt, dass es eine Option h mit einem Wert foo gibt). Ja
Vollständig plattformübergreifend Ja
zur nutzung:
Veröffentlicht unter der Apache 2.0-Lizenz.
Ideal, aber nicht notwendig:
VERWENDUNG Verwendung: 1) Erstellen Sie eine Instanz von FeSimpleArgs
FeSimpleArgs parser = new FeSimpleArgs();
2) Verwenden Sie es, um Ihre Argumente zu analysieren:
FeSimpleArgs.Result result = parser.parse ("-def=value1 --GHI=value2 -a -b -c=value3 -n=\"foo bar baz\" -- param1 -param2");
3) Untersuchen Sie Ihre Ergebnisse: Aus dem Obigen besteht das Ergebnis aus einer Map, die die folgenden Argumente und Flags enthält (beachten Sie, dass „Argument“ oder „Flag“ keine wirkliche Bedeutung haben, ich verwende diese Begriffe nur, um zu trennen, ob sie gelten Werte oder nicht - alle befinden sich in derselben Map).
Und eine Liste mit diesen Parametern (beachten Sie, dass der führende Bindestrich erhalten bleibt) - param1 - -param2
4) Gewinn?
Weitere Beispiele finden Sie in den enthaltenen Unit-Tests.
Haftungsausschluss: Ich bin der Autor von FeSimpleArgs
compile
ein Pattern
, das sich nie ändert, tokenize2
nie verwendet wird und so weiter. Vielleicht möchten Sie eine Frage auf CodeReview.SE stellen .Ich habe args4j erfolgreich in einer Reihe von Projekten eingesetzt. Es wurde von Kohsuke Kawaguchi entwickelt, der auch Jenkins entwickelt hat, Hauptentwickler für JAXB und andere Projekte war, also hat er einen sehr guten Stammbaum.
String[]
und (zum Beispiel) a Map
von Optionen zurückbekommen kann, nicht etwas, das automatisch die Optionen aus den übergebenen Argumenten analysiert und der JAR-Datei zuweist . Außerdem muss es mir sagen können, welche Optionen mit welchen Argumenten übergeben wurden, anstatt dass ich ihm sage, nach welchen Optionen es suchen soll.Hinweis: Diese Antwort ist veraltet, da OP die Frage bearbeitet hat, um eine Anforderung hinzuzufügen, die diese nicht erfüllt (es ist jedoch immer noch verdammt gut zu wissen). Siehe die Kommentare unten. Das OP möchte NICHT , dass Sie diese Antwort ablehnen.
Der Klassiker dafür in Unix/Linux, noch aus C-Tagen, war GetOpt().
Gnome hat hier einen Java-Port .
String
und eine Aufzählung benötigt , oder ein Predicate<T>
, oder so.Picocli könnte von Interesse sein. Es handelt sich um eine einzelne Quelldatei, um Entwickler von Befehlszeilen-Apps zu ermutigen, sie als einfachere Alternative zum Schattieren von Gläsern in einem Uberjar als Quelle einzuschließen. Es erfüllt auch alle anderen Anforderungen, die im OP - UPDATE angegeben sind: mit Ausnahme der Anforderung, dass Optionen nicht zur Kompilierzeit behoben werden können :-(.
UPDATE 2: picocli 3.x bietet zusätzlich zur Annotations-API eine programmatische API, erfüllt also jetzt alle Anforderungen. Beachten Sie, dass Groovy CliBuilder seit Groovy 2.5 auf Picocli basiert. Das ist genau das, wonach das OP fragt: Optionen und Positionsparameter dynamisch zu einem Befehl hinzufügen.
Es hat kürzlich eine Autovervollständigungsfunktion hinzugefügt.
Eine weitere Funktion, die Ihnen gefallen könnte, ist die farbige Nutzungshilfe.
Parser-Funktionen:
<command> -xvfInputFile
sowie <command> -x -v -f InputFile
) und GNU-Long-Optionen"1..*"
."3..5"
Die Hilfemeldung zur Verwendung kann einfach mit Anmerkungen angepasst werden (ohne Programmierung). Zum Beispiel:
( Quelle )
Ich konnte nicht widerstehen, einen weiteren Screenshot hinzuzufügen, um zu zeigen, welche Hilfemeldungen zur Verwendung möglich sind. Die Nutzungshilfe ist das Gesicht Ihrer Anwendung, also seien Sie kreativ und haben Sie Spaß!
Haftungsausschluss: Ich habe Picocli erstellt. Feedback oder Fragen sehr willkommen.
ein Pferd ohne Name
Nik
CPerkins
works like getopt
" Ihre zweite Anforderung ist.Nik
CPerkins
Nik
-n "foo bar baz"
das Flagn
mit parameter verarbeitet würdefoo bar baz
, anstattn
mit parameter"foo
und zwei Argumentenbar
undbaz"
.Nik
CPerkins
-n foo bar baz
? Mit den Anführungszeichen ist klar, was Sie wollen. Ich denke, ich frage, ob Leerzeichen immer ein Trennzeichen sind.Nik
CPerkins