CLI-Frameworks für Java: Leistungsstarke Konsolenanwendungen erstellen
Die Entwicklung komplexer Konsolenanwendungen in Java erfordert nicht nur Logik, sondern auch eine benutzerfreundliche Kommandozeilenschnittstelle (CLI). Das manuelle Parsen von Argumenten, die Verarbeitung von Optionen und die Ausgabe von Hilfetexten sind aufwändig und fehleranfällig. Glücklicherweise gibt es ausgereifte CLI-Frameworks, die diesen Prozess automatisieren. In diesem Artikel betrachten wir drei führende Tools im Detail: Picocli, JCommander und Spring Shell, mit Codebeispielen und Empfehlungen zur Auswahl.
1. Picocli – Modern und leistungsstark
Picocli (https://picocli.info/) ist das derzeit beliebteste CLI-Framework für Java. Sein Hauptvorteil ist eine minimalistische, auf Annotationen basierende API und die Unterstützung von Java sowie Kotlin, Groovy und Scala. Die Bibliothek benötigt keine externen Abhängigkeiten und kann Auto-Vervollständigung für Bash, Zsh und Fish generieren.
Hauptfunktionen von Picocli:
- Annotationen
@Command,@Option,@Parameters - Automatische Generierung von Hilfetexten (
--help) - Verschachtelte Befehle (Unterbefehle)
- Unterstützung von Werttypen (int, boolean, enum, LocalDate)
- Benutzerdefinierte Konverter und Validatoren
Beispiel einer einfachen Anwendung mit Picocli:
import picocli.CommandLine;import picocli.CommandLine.Command;import picocli.CommandLine.Option;import picocli.CommandLine.Parameters;
@Command(name = "greet", description = "Begrüßt den Benutzer")public class GreetApp implements Runnable {
@Option(names = {"-n", "--name"}, defaultValue = "Welt", description = "Name für die Begrüßung") private String name;
@Option(names = {"-c", "--count"}, defaultValue = "1", description = "Anzahl der Wiederholungen") private int count;
@Override public void run() { for (int i = 0; i < count; i++) { System.out.println("Hallo, " + name + "!"); } }
public static void main(String[] args) { int exitCode = new CommandLine(new GreetApp()).execute(args); System.exit(exitCode); }}Ausführung:
java GreetApp --name="Java-Entwickler" --count=3Ausgabe:
Hallo, Java-Entwickler!Hallo, Java-Entwickler!Hallo, Java-Entwickler!2. JCommander – Bewährter Klassiker
JCommander (https://jcommander.org/) ist eine ausgereifte Bibliothek mit einer langen Geschichte (seit 2011). Sie verwendet ebenfalls Annotationen, bietet aber eine flexiblere Architektur für komplexe Szenarien. JCommander eignet sich besonders für Projekte, die eine strenge Kontrolle über das Parsen und die Fehlerbehandlung erfordern.
Wesentliche Merkmale von JCommander:
- Annotationen
@Parametermit Attributennames,required,description - Unterstützung mehrstufiger Befehle über
Commands - Integrierter Parameter-Validator
- Möglichkeit zur Verwendung beliebiger Typen über Konverter
Beispiel mit JCommander:
import com.beust.jcommander.JCommander;import com.beust.jcommander.Parameter;import com.beust.jcommander.Parameters;
@Parameters(commandDescription = "Taschenrechner")public class Calculator {
@Parameter(names = {"--a"}, description = "Erste Zahl", required = true) private int a;
@Parameter(names = {"--b"}, description = "Zweite Zahl", required = true) private int b;
@Parameter(names = {"--op"}, description = "Operation: add, sub, mul, div") private String operation = "add";
public void run() { int result; switch (operation) { case "add": result = a + b; break; case "sub": result = a - b; break; case "mul