Frameworks CLI para Java: Picocli, JCommander y Spring Shell

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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 @Parameter con nombres y descripciones
  • Soporte para comandos anidados mediante JCommander.addCommand()
  • Validación a través de IParameterValidator personalizados
  • 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

Recommendations