Interaktive Java-Konsolen mit JLine und ConsoleUI

Blog

HeimHeim / Blog / Interaktive Java-Konsolen mit JLine und ConsoleUI

May 01, 2024

Interaktive Java-Konsolen mit JLine und ConsoleUI

Von Matthew Tyson Softwarearchitekt, InfoWorld | Die Befehlszeilenschnittstelle (CLI) ist die innere Welt der Softwareentwicklung. Von der Shell aus haben wir direkten Zugriff auf alle Betriebssysteme

Von Matthew Tyson

Softwarearchitekt, InfoWorld |

Die Befehlszeilenschnittstelle (CLI) ist die innere Welt der Softwareentwicklung. Von der Shell aus haben wir direkten Zugriff auf alle Funktionen des Betriebssystems und damit die Möglichkeit, alle Aspekte der Software zu erstellen und zu orchestrieren. Viele Tools und Frameworks enthalten Befehlszeilen. Darüber hinaus ist die Eingabeaufforderung die grundlegende Magie der Arbeit mit Softwaresystemen. Es ist die Heimat nahezu unbegrenzter Möglichkeiten.

In diesem Artikel machen wir einen Rundgang durch die Erstellung anspruchsvoller interaktiver Befehlszeilenschnittstellenanwendungen (CLI) und REPLs (Lese-Auswertungs-Druckschleifen oder interaktive Shells) in Java. Wir richten eine einfache Demoanwendung in Java ein und verwenden die JLine- und ConsoleUI-Bibliotheken, um die von uns benötigten Funktionen hinzuzufügen.

Unsere Demonstration basiert auf einer theoretischen Anwendung, die das Arbeitsverzeichnis eines Softwareprojekts untersucht und dort Informationen über die Projekte sammelt. Die Anwendung ist auch in der Lage, neue Projekte im Verzeichnis zu erstellen. Die Beispielanwendung startet eine REPL, die zwei Befehle akzeptiert, „beschreiben“ und „erstellen“, die durch Tabulatoren vervollständigt werden können. Der Befehl „beschreiben“ listet die Ordnerhierarchie des Arbeitsverzeichnisses mit Farbcodierung auf (ggf. unter Verwendung von Paging), während „erstellen“ ein interaktives Menü initiiert, in dem der Benutzer auswählen kann, welche Art von Projekt erstellt werden soll – Java, JavaScript oder Python. Wenn es sich um eine Java-Anwendung handelt, ermöglichen wir eine Mehrfachauswahl zusätzlicher Funktionen, die der Benutzer hinzufügen kann (Datenbank oder REST-API), sodass wir ein verschachteltes Menü sehen können.

Wir verwenden diese Funktionen nur, um die JLine-Funktionen zu erkunden, anstatt sie tatsächlich zu implementieren.

Für diese Tour benötigen Sie ein Java JDK und Maven. Wir beginnen mit der Erstellung einer neuen Anwendung mit einem Maven-Archetyp, wie in Listing 1 gezeigt.

Maven wird diese Befehle verwenden, um ein neues Projekt für uns zu entwerfen. Bevor wir fortfahren, fügen wir auch alle benötigten Abhängigkeiten hinzu und setzen die Java-Version auf 11 (jede Version ab Java 8 sollte funktionieren), wie ich es in Listing 2 getan habe. Dies gilt für die POM .xml-Datei im Projektstamm (lassen Sie den Rest der pom.xml unverändert).

Als nächstes ändern wir die Hauptklasse in src/main/java/com/infoworld/App.java, um eine REPL-Schleife zu starten. Ändern Sie App.java mit dem Code in Listing 3.

Listing 3 erstellt ein sehr einfaches Programm, das nach Benutzereingabezeilen Ausschau hält und diese zurückgibt. Dazu habe ich einen „Vervollständiger“ hinzugefügt, der die beiden Befehle enthält, die wir unterstützen, beschreiben und erstellen. Das heißt, wenn der Benutzer an der Eingabeaufforderung tippt, kann er diese Befehle mit der Tabulatortaste ausführen. Durch zweimaliges Tippen wird ein Menü mit den verfügbaren Befehlen angezeigt. JLine hat dies mit dem Methodenaufruf .completer(new StringsCompleter("describe", "create")) im fließenden Stil sehr einfach gemacht. JLine verfügt zusätzlich zu Strings über mehrere integrierte Vervollständiger, und Sie können auch eigene erstellen.

Im Grunde ist die REPL eine Endlosschleife, die unterbrochen wird, wenn der Benutzer „exit“ betritt.

Sie können es testen, indem Sie den in Listing 4 gezeigten Maven-Befehl exec:java ausführen.

Sie erhalten die Karotten-Eingabeaufforderung, die Echo-Antwort und die Tab-Vervollständigungsbefehle.

Da nun echo REPL mit der automatischen Vervollständigung arbeitet, können wir uns nun an die eigentlichen Befehle machen. Wir machen dies mit typischem Java, indem wir die eingegebene Zeichenfolge mit den Befehlen vergleichen und jeweils Methoden aufrufen. Vorerst wird „create“ nichts bewirken, aber wir implementieren die Logik zur Ausgabe der Verzeichnishierarchie, wie in Listing 5 gezeigt.

Wenn Sie nun die Anwendung ausführen und den Befehl „beschreiben“ eingeben, wird eine eingerückte Liste des Arbeitsverzeichnisses angezeigt. Der Aufbau dieser Zeichenfolge erfolgt in getDirectoryHierarchy(). Diese Methode verwendet normales Java aus dem Paket java.nio.file, um das Verzeichnis zu durchsuchen und jede Datei und jedes Verzeichnis auszugeben, wobei für jede Ebene des Verzeichnisses, nach der wir gehen, ein Leerzeichen eingerückt wird. Diese Arbeit wird hauptsächlich mit path.relativize(p).getNameCount() erledigt, das besagt: Geben Sie mir von meinem aktuellen Pfad (.) den relativen Pfad zum aktuellen (z. B. ./src/main/java). getNameCount() zählt lediglich die Anzahl der Namen in diesem Pfad – in diesem Fall drei. Für jeden Namen fügen wir ein Leerzeichen hinzu.