Consoles Java interactives avec JLine et ConsoleUI

Blog

MaisonMaison / Blog / Consoles Java interactives avec JLine et ConsoleUI

May 01, 2024

Consoles Java interactives avec JLine et ConsoleUI

Par Matthew Tyson Architecte logiciel, InfoWorld | L'interface de ligne de commande (CLI) est le monde intérieur du développement logiciel. Depuis le shell, nous avons un accès direct à tous les composants du système d'exploitation

Par Matthieu Tyson

Architecte logiciel, InfoWorld |

L'interface de ligne de commande (CLI) est le monde intérieur du développement logiciel. Depuis le shell, nous avons un accès direct à toutes les fonctionnalités du système d'exploitation, ce qui nous permet de composer et d'orchestrer tous les aspects du logiciel. De nombreux outils et frameworks intègrent des lignes de commande. Non seulement cela, mais l’invite de commande est la magie fondamentale du travail avec des systèmes logiciels ; c'est la maison de possibilités presque illimitées.

Dans cet article, nous allons faire le tour de la création d'applications d'interface de ligne de commande (CLI) interactives sophistiquées et de REPL (boucles lecture-évaluation-impression ou shells interactifs) en Java. Nous allons configurer une application de démonstration de base en Java et utiliser les bibliothèques JLine et ConsoleUI pour ajouter les fonctionnalités dont nous avons besoin.

Notre démonstration est basée sur une application théorique qui examine le répertoire de travail d'un projet logiciel et y rassemble des informations sur les projets. L'application est également capable de créer de nouveaux projets dans le répertoire. L'exemple d'application démarrera un REPL qui accepte deux commandes, décrire et créer, qui peuvent être complétées par des tabulations. La commande décrire répertorie la hiérarchie des dossiers du répertoire de travail avec un codage couleur (en utilisant la pagination si nécessaire), tandis que créer lance un menu interactif qui permet à l'utilisateur de choisir le type de projet à créer : Java, JavaScript ou Python. S'il s'agit d'une application Java, nous autoriserons une sélection multiple de fonctionnalités supplémentaires que l'utilisateur pourra ajouter (base de données ou API REST) ​​qui nous permettront de voir un menu imbriqué.

Nous utiliserons simplement ces fonctionnalités pour explorer les capacités de JLine, plutôt que de les implémenter réellement.

Pour cette visite guidée, vous aurez besoin d'un Java JDK et de Maven installés. Nous allons commencer par créer une nouvelle application avec un archétype Maven, comme celui présenté dans le listing 1.

Maven utilisera ces commandes pour nous présenter un nouveau projet. Avant d'aller plus loin, ajoutons également toutes les dépendances dont nous aurons besoin, et définissons également la version Java sur 11 (n'importe quelle version à partir de Java 8 devrait fonctionner), comme je l'ai fait dans le listing 2. Cela s'applique au pom Fichier .xml à la racine du projet (laissez le reste du fichier pom.xml tel quel).

Ensuite, modifions la classe principale dans src/main/java/com/infoworld/App.java pour démarrer une boucle REPL. Modifiez App.java en utilisant le code du listing 3.

Le listing 3 crée un programme très simple qui surveille les lignes de saisie de l'utilisateur et les renvoie. À cela, j'ai ajouté un « complèteur », qui contient les deux commandes que nous prenons en charge, décrivons et créons. Cela signifie que lorsque l'utilisateur tape à l'invite, il peut tabuler pour exécuter ces commandes. Tabuler deux fois offrira un menu avec les commandes disponibles. JLine a rendu cela très simple avec l'appel de méthode .completer(new StringsCompleter("describe", "create")) de style fluide. JLine possède plusieurs compléteurs intégrés, en plus des chaînes, et vous pouvez également créer le vôtre.

Au fond, le REPL est une boucle while infinie, qui s'interrompt lorsque l'utilisateur entre dans exit.

Vous pouvez le tester en exécutant la commande Maven exec:java présentée dans le listing 4.

Vous obtiendrez l'invite carotte, la réponse d'écho et les commandes de complétion de tabulation.

Maintenant que echo REPL fonctionne avec la saisie semi-automatique, traitons réellement les commandes. Nous ferons cela avec Java typique, en comparant la chaîne saisie avec les commandes et les méthodes d'appel pour chacune. Pour l'instant, create ne fera rien, mais nous allons implémenter la logique pour afficher la hiérarchie des répertoires, comme indiqué dans le listing 5.

Désormais, lorsque vous exécutez l'application, si vous entrez la commande décrire, vous verrez une liste au format retrait du répertoire de travail. Le travail de construction de cette chaîne se déroule dans getDirectoryHierarchy(). Cette méthode utilise Java normal du package java.nio.file pour parcourir le répertoire et afficher chaque fichier et répertoire, en indentant un espace pour chaque niveau de répertoire que nous descendons. Ce travail est principalement effectué avec path.relativize(p).getNameCount(), qui dit : à partir de mon chemin actuel (.) donnez-moi le chemin relatif vers celui actuel (par exemple, ./src/main/java). getNameCount() compte simplement le nombre de noms dans ce chemin – trois, dans ce cas. Pour chaque nom, nous ajoutons un espace.