Frameworks CLI para Java: creando potentes aplicaciones de consola
El desarrollo de aplicaciones de consola (CLI) en Java es una tarea que enfrenta todo desarrollador. El manejo manual de argumentos de línea de comandos a través de main(String[] args) rápidamente se vuelve engorroso y propenso a errores. Afortunadamente, en el ecosistema Java existen frameworks maduros que se encargan del análisis, validación, autocompletado y generación de ayuda. En este artículo analizaremos tres herramientas líderes: Picocli, JCommander y Spring Shell.
1. Picocli — moderno y de alto rendimiento
Picocli es un framework de tamaño mínimo (solo 1,5 MB) que no requiere dependencias externas. Soporta anotaciones, autocompletado para Bash/Zsh y generación integrada de ayuda. Picocli es ideal para microservicios y herramientas de línea de comandos.
Características principales:
- Anotaciones
@Command,@Option,@Parameters - Subcomandos anidados (subcommands)
- Parámetros tipados (int, boolean, enum, colecciones)
- Validación automática (parámetros obligatorios, rangos)
- Salida a color y barras de progreso
- Compilación nativa GraalVM
Ejemplo de código:
import picocli.CommandLine;import picocli.CommandLine.Command;import picocli.CommandLine.Option;import picocli.CommandLine.Parameters;
@Command(name = "greet", description = "Saludo al usuario")public class GreetCommand implements Runnable {
@Option(names = {"-n", "--name"}, description = "Nombre del usuario", required = true) private String name;
@Option(names = {"-c", "--count"}, description = "Número de repeticiones", defaultValue = "1") private int count;
@Parameters(index = "0", description = "Mensaje", defaultValue = "Hola") private String message;
@Override public void run() { for (int i = 0; i < count; i++) { System.out.println(message + ", " + name + "!"); } }
public static void main(String[] args) { int exitCode = new CommandLine(new GreetCommand()).execute(args); System.exit(exitCode); }}Ejecución: java GreetCommand -n Mundo -c 2 "Hola" mostrará:
Hola, Mundo!Hola, Mundo!2. JCommander — probado por el tiempo
JCommander es uno de los frameworks CLI más antiguos (desde 2010), utilizado en proyectos como Jenkins y TestNG. Soporta anotaciones, tipos complejos e internacionalización. JCommander se destaca por su API simple y excelente documentación.
Características clave:
- Anotaciones
@Parametercon nombres y descripciones - Soporte para comandos anidados mediante
JCommander.addCommand() - Validación a través de
IParameterValidatorpersonalizados - Generación de ayuda con
usage() - Trabajo con archivos de configuración
Ejemplo de código:
import com.beust.jcommander.JCommander;import com.beust.jcommander.Parameter;import com.beust.jcommander.Parameters;
@Parameters(commandDescription = "Calculadora")public class CalculatorCommand {
@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() { double result; switch (operation) { case "add": result = a + b; break; case "sub": result = a - b; break; case "mul": result = a * b; break; case "div": result