Frameworks CLI para Java: creando potentes aplicaciones de consola
El desarrollo de aplicaciones de consola complejas en Java requiere no solo lógica, sino también una interfaz de línea de comandos (CLI) conveniente. El análisis de argumentos, el manejo de opciones, la visualización de ayuda: la implementación manual de estas tareas es laboriosa y propensa a errores. Afortunadamente, existen frameworks CLI maduros que automatizan este proceso. En este artículo, analizaremos en detalle tres herramientas líderes: Picocli, JCommander y Spring Shell, con ejemplos de código y recomendaciones para elegir.
1. Picocli — moderno y de alto rendimiento
Picocli (https://picocli.info/) es el framework CLI más popular para Java en la actualidad. Su principal ventaja es una API minimalista basada en anotaciones y soporte tanto para Java como para Kotlin, Groovy y Scala. La biblioteca no requiere dependencias externas y puede generar autocompletado para Bash, Zsh y Fish.
Características principales de Picocli:
- Anotaciones
@Command,@Option,@Parameters - Generación automática de ayuda (
--help) - Comandos anidados (subcomandos)
- Soporte para tipos de valor (int, boolean, enum, LocalDate)
- Convertidores y validadores personalizados
Ejemplo de una aplicación simple con Picocli:
import picocli.CommandLine;import picocli.CommandLine.Command;import picocli.CommandLine.Option;import picocli.CommandLine.Parameters;
@Command(name = "greet", description = "Saluda al usuario")public class GreetApp implements Runnable {
@Option(names = {"-n", "--name"}, defaultValue = "mundo", description = "Nombre para saludar") private String name;
@Option(names = {"-c", "--count"}, defaultValue = "1", description = "Número de repeticiones") private int count;
@Override public void run() { for (int i = 0; i < count; i++) { System.out.println("¡Hola, " + name + "!"); } }
public static void main(String[] args) { int exitCode = new CommandLine(new GreetApp()).execute(args); System.exit(exitCode); }}Ejecución:
java GreetApp --name="Desarrollador Java" --count=3Salida:
¡Hola, Desarrollador Java!¡Hola, Desarrollador Java!¡Hola, Desarrollador Java!2. JCommander — un clásico probado
JCommander (https://jcommander.org/) es una biblioteca madura con una larga trayectoria (desde 2011). También utiliza anotaciones, pero ofrece una arquitectura más flexible para escenarios complejos. JCommander es especialmente útil para proyectos que requieren un control estricto sobre el análisis y el manejo de errores.
Características clave de JCommander:
- Anotaciones
@Parametercon atributosnames,required,description - Soporte para comandos multinivel a través de
Commands - Validador de parámetros integrado
- Posibilidad de usar tipos arbitrarios mediante convertidores
Ejemplo con JCommander:
import com.beust.jcommander.JCommander;import com.beust.jcommander.Parameter;import com.beust.jcommander.Parameters;
@Parameters(commandDescription = "Calculadora")public class Calculator {
@Parameter(names = {"--a"}, description = "Primer número", required = true) private int a;
@Parameter(names = {"--b"}, description = "Segundo número", required = true) private int b;
@Parameter(names = {"--op"}, description = "Operación: 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