Frameworks CLI para Java: criando aplicações de console poderosas
O desenvolvimento de aplicações de console (CLI) em Java é uma tarefa que todo desenvolvedor enfrenta. O tratamento manual de argumentos de linha de comando via main(String[] args) rapidamente se torna complicado e propenso a erros. Felizmente, no ecossistema Java existem frameworks maduros que cuidam do parsing, validação, autocompletar e geração de ajuda. Neste artigo, vamos analisar três ferramentas líderes: Picocli, JCommander e Spring Shell.
1. Picocli — moderno e performático
Picocli é um framework de tamanho mínimo (apenas 1,5 MB) que não requer dependências externas. Ele suporta anotações, autocompletar para Bash/Zsh e geração de ajuda embutida. Picocli é ideal para microsserviços e ferramentas de linha de comando.
Principais recursos:
- Anotações
@Command,@Option,@Parameters - Subcomandos aninhados (subcommands)
- Parâmetros tipados (int, boolean, enum, coleções)
- Validação automática (parâmetros obrigatórios, intervalos)
- Saída colorida e barras de progresso
- Compilação nativa GraalVM
Exemplo de código:
import picocli.CommandLine;import picocli.CommandLine.Command;import picocli.CommandLine.Option;import picocli.CommandLine.Parameters;
@Command(name = "greet", description = "Saudação ao usuário")public class GreetCommand implements Runnable {
@Option(names = {"-n", "--name"}, description = "Nome do usuário", required = true) private String name;
@Option(names = {"-c", "--count"}, description = "Número de repetições", defaultValue = "1") private int count;
@Parameters(index = "0", description = "Mensagem", defaultValue = "Olá") 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); }}Execução: java GreetCommand -n Mundo -c 2 "Olá" exibirá:
Olá, Mundo!Olá, Mundo!2. JCommander — testado pelo tempo
JCommander é um dos frameworks CLI mais antigos (desde 2010), usado em projetos como Jenkins e TestNG. Ele suporta anotações, tipos complexos e internacionalização. JCommander se destaca pela simplicidade da API e excelente documentação.
Características principais:
- Anotações
@Parametercom nomes e descrições - Suporte a comandos aninhados via
JCommander.addCommand() - Validação através de
IParameterValidatorpersonalizados - Geração de ajuda com
usage() - Trabalho com arquivos de configuração
Exemplo 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 = "Primeiro número", required = true) private int a;
@Parameter(names = {"--b"}, description = "Segundo número", required = true) private int b;
@Parameter(names = {"--op"}, description = "Operação: 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 Também na biblioteca
Verificações de tipo condicional para TypeScript: guia completo com exemplos
Testes em JavaScript (Node.js): frameworks e ferramentas
Validação de dados em Go: visão geral de bibliotecas e abordagens
Tokens JWT em JavaScript (Node.js): Guia Completo
Trabalho com CSV em PHP: leitura, escrita e processamento de dados