Java CLI框架:创建强大的控制台应用
Java仍然是创建服务器端应用最流行的语言之一,但用其编写控制台工具也很常见。然而,通过args[]手动解析命令行参数,在出现选项、标志和嵌套命令时会迅速变得混乱。专门的CLI框架可以派上用场。在本文中,我们将介绍三种领先的工具:Picocli、JCommander和Spring Shell。您将了解它们的特点,看到代码示例,并能够为您的项目选择合适的一个。
1. Picocli — 现代且高性能
Picocli(发音为“派克-克利”)是一个轻量级框架,依赖项极少。它支持注解、shell中的自动补全、嵌套命令,甚至生成man页面格式的帮助信息。Picocli非常适合创建简单的工具和复杂的多级CLI。
使用Picocli的简单计算器示例:
import picocli.CommandLine;import picocli.CommandLine.Command;import picocli.CommandLine.Option;import picocli.CommandLine.Parameters;
@Command(name = "calc", mixinStandardHelpOptions = true, version = "1.0", description = "简单计算器")public class Calculator implements Runnable {
@Parameters(index = "0", description = "第一个数字") private double a;
@Parameters(index = "1", description = "第二个数字") private double b;
@Option(names = {"-o", "--operation"}, defaultValue = "+", description = "操作:+, -, *, /") private String operation;
@Override public void run() { double result = switch (operation) { case "+" -> a + b; case "-" -> a - b; case "*" -> a * b; case "/" -> a / b; default -> throw new IllegalArgumentException("未知操作: " + operation); }; System.out.printf("结果: %.2f%n", result); }
public static void main(String[] args) { int exitCode = new CommandLine(new Calculator()).execute(args); System.exit(exitCode); }}运行:java Calculator 10 5 -o "*" 将输出 结果: 50.00。Picocli会自动为--help生成帮助信息,为--version生成版本信息。
2. JCommander — 久经考验
JCommander是Java中最古老的参数解析库之一。它使用注解,但在解析方面提供了更多的手动控制。JCommander通常被选用于需要灵活性和与现有代码集成的项目。
使用JCommander的货币转换器示例:
import com.beust.jcommander.JCommander;import com.beust.jcommander.Parameter;import com.beust.jcommander.Parameters;
@Parameters(commandDescription = "货币转换器")public class CurrencyConverter {
@Parameter(names = {"--amount", "-a"}, description = "金额", required = true) private Double amount;
@Parameter(names = {"--from", "-f"}, description = "从哪种货币 (USD, EUR)", required = true) private String from;
@Parameter(names = {"--to", "-t"}, description = "转换成哪种货币", required = true) private String to;
@Parameter(names = {"--help", "-h"}, help = true, description = "显示帮助") private boolean help;
public void run() { if (help) { JCommander jc = new JCommander(this); jc.usage(); return; } // 简化的转换逻辑 double rate = switch (from.toUpperCase() + "_" + to.toUpperCase()) { case "USD_EUR" -> 0.92; case "EUR_USD" -> 1.09; default -> 1.0; }; System.out.printf("%.2f %s = %.2f %s%n", amount, from.toUpperCase(), amoun