推荐使用 apache commons cli 库解析命令行参数,它支持短/长选项、参数绑定、必填校验和帮助生成;基础场景可直接遍历 args 数组。

Java 程序通过 main(String[] args) 方法接收命令行参数,args 是一个字符串数组,按空格分隔(不支持引号内空格自动合并)。要安全、清晰地解析参数,推荐使用成熟库如 Apache Commons CLI,它支持短选项(-h)、长选项(--help)、参数值绑定、必填校验和帮助生成。
基础用法:直接读取 args 数组
适用于简单脚本,无复杂选项逻辑:
-
java MyApp arg1 arg2 --verbose→args = ["arg1", "arg2", "--verbose"] - 需手动遍历判断是否为选项、提取值、处理顺序依赖
- 不支持
-o file.txt和-o=file.txt自动兼容,也不提供错误提示或帮助信息
推荐方案:Apache Commons CLI(Maven 依赖)
添加依赖(Maven):
完整可运行示例:
import org.apache.commons.cli.*;
public class CliExample {
public static void main(String[] args) {
// 1. 定义选项
Options options = new Options();
options.addOption("h", "help", false, "显示帮助信息");
options.addOption("i", "input", true, "输入文件路径(必需)");
options.addOption("o", "output", true, "输出文件路径");
options.addOption("v", "verbose", false, "启用详细日志");
// 2. 解析命令行
CommandLineParser parser = new DefaultParser();
try {
CommandLine cmd = parser.parse(options, args);
// 3. 使用解析结果
if (cmd.hasOption("h")) {
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp("java CliExample", options);
return;
}
String input = cmd.getOptionValue("i");
if (input == null) {
System.err.println("错误:-i/--input 参数为必需项");
System.exit(1);
}
String output = cmd.getOptionValue("o", "output.txt"); // 默认值
boolean verbose = cmd.hasOption("v");
System.out.printf("输入:%s%n", input);
System.out.printf("输出:%s%n", output);
System.out.printf("详细模式:%s%n", verbose);
} catch (ParseException e) {
System.err.println("参数解析错误:" + e.getMessage());
new HelpFormatter().printHelp("java CliExample", options);
System.exit(1);
}
}
}
常见调用方式与输出效果
编译运行后支持以下典型用法:
-
java CliExample -i data.csv -o result.json -v→ 正常执行,启用详细日志 -
java CliExample --input config.yml --help→ 打印格式化帮助文本 -
java CliExample -i→ 报错:“参数解析错误:-i 选项需要参数” -
java CliExample -i in.txt -o out.txt --unknown→ 报错:“无法识别的选项:--unknown”
注意事项与建议
避免踩坑的关键点:
- 短选项(
-i)默认不接受等号写法(-i=file.txt),需启用parser.setAllowPartialMatching(false)并确保版本 ≥ 1.4 - 如果需要支持位置参数(如
java MyApp cmd subcmd --flag),用cmd.getArgList()获取剩余非选项参数 - 敏感参数(如密码)不要通过命令行传入,应改用文件或环境变量,防止被 ps/top 泄露
- 生产工具建议加上
--version选项,用Package.getImplementationVersion()或构建时注入
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











