Consolas Java interactivas con JLine y ConsoleUI

Blog

HogarHogar / Blog / Consolas Java interactivas con JLine y ConsoleUI

May 01, 2024

Consolas Java interactivas con JLine y ConsoleUI

Por Matthew Tyson Arquitecto de software, InfoWorld | La interfaz de línea de comandos (CLI) es el mundo interior del desarrollo de software. Desde el shell tenemos acceso directo a todas las funciones del sistema operativo.

Por Matthew Tyson

Arquitecto de software, InfoWorld |

La interfaz de línea de comandos (CLI) es el mundo interior del desarrollo de software. Desde el shell, tenemos acceso directo a todas las capacidades del sistema operativo, y con eso viene el poder de componer y orquestar todos los aspectos del software. Muchas herramientas y marcos incorporan líneas de comando. No sólo eso, sino que el símbolo del sistema es la magia fundamental del trabajo con sistemas de software; es el hogar de posibilidades casi ilimitadas.

En este artículo, haremos un recorrido por la creación de aplicaciones sofisticadas de interfaz de línea de comandos (CLI) interactiva y REPL (bucles de lectura, evaluación e impresión o shells interactivos) en Java. Configuraremos una aplicación de demostración básica en Java y usaremos las bibliotecas JLine y ConsoleUI para agregar las funciones que necesitamos.

Nuestra demostración se basa en una aplicación teórica que examina el directorio de trabajo de un proyecto de software y recopila información sobre los proyectos allí. La aplicación también puede crear nuevos proyectos en el directorio. La aplicación de ejemplo iniciará un REPL que acepta dos comandos, describir y crear, que se pueden completar con tabulaciones. El comando describir enumerará la jerarquía de carpetas del directorio de trabajo con codificación de colores (usando paginación si es necesario), mientras que crear inicia un menú interactivo que permite al usuario elegir qué tipo de proyecto crear: Java, JavaScript o Python. Si es una aplicación Java, permitiremos una selección múltiple de funciones adicionales que el usuario puede agregar (base de datos o API REST) ​​que nos permitirán ver un menú anidado.

Simplemente usaremos estas características para explorar las capacidades de JLine, en lugar de implementarlas realmente.

Para este recorrido, necesitará Java JDK y Maven instalados. Comenzaremos creando una aplicación nueva con un arquetipo Maven, como lo que se muestra en el Listado 1.

Maven usará estos comandos para diseñarnos un nuevo proyecto. Antes de continuar, agreguemos también todas las dependencias que necesitaremos y también configuremos la versión de Java en 11 (cualquier versión desde Java 8 en adelante debería funcionar), como lo hice en el Listado 2. Esto se aplica al pom. .xml en la raíz del proyecto (deje el resto del pom.xml como está).

A continuación, modifiquemos la clase principal en src/main/java/com/infoworld/App.java para iniciar un bucle REPL. Modifique App.java usando el código del Listado 3.

El Listado 3 crea un programa muy simple que busca líneas de entrada del usuario y las repite. A eso, agregué un "completador", que contiene los dos comandos que apoyamos, describimos y creamos. Eso significa que cuando el usuario escribe cuando se le solicita, puede presionar el tabulador para completar estos comandos. Al presionar dos veces se ofrecerá un menú con los comandos disponibles. JLine ha hecho esto muy fácil con la llamada al método .completer(new StringsCompleter("describe", "create")) de estilo fluido. JLine tiene varios completadores integrados, además de Strings, y también puedes crear el tuyo propio.

En esencia, REPL es un bucle while infinito, que se rompe cuando el usuario ingresa a la salida.

Puede probarlo ejecutando el comando Maven exec:java que se muestra en el Listado 4.

Obtendrá el mensaje de zanahoria, la respuesta de eco y los comandos para completar tabulaciones.

Ahora que tenemos echo REPL funcionando con autocompletar, manejemos los comandos. Haremos esto con Java típico, comparando la cadena ingresada con los comandos y llamando a los métodos para cada uno. Por ahora, crear no hará nada, pero implementaremos la lógica para generar la jerarquía de directorios, como se muestra en el Listado 5.

Ahora, cuando ejecute la aplicación, si ingresa el comando describe, verá una lista con formato de sangría del directorio de trabajo. El trabajo de construir esa cadena ocurre en getDirectoryHierarchy(). Ese método utiliza Java normal del paquete java.nio.file para recorrer el directorio y generar cada archivo y directorio, sangrando un espacio para cada nivel de directorio que bajamos. Este trabajo se realiza principalmente con path.relativize(p).getNameCount(), que dice: desde mi ruta actual (.) dame la ruta relativa a la actual (por ejemplo, ./src/main/java). getNameCount() simplemente cuenta el número de nombres en esa ruta: tres, en este caso. Para cada nombre, agregamos un espacio.