1. 简介
在服务端开发中,通过命令行启动应用并传入参数是非常常见的操作。✅
我们通常不希望程序每次运行都做完全一样的事——而是希望通过某种方式配置其行为。
本文将带你掌握在 Java 中如何处理命令行参数,内容虽短但实用,适合快速查阅和踩坑参考。
2. 如何在 Java 中获取命令行参数
Java 程序的入口是 main
方法,JVM 会把命令行参数作为该方法的参数传递进来。这是最基础也是最核心的机制。
标准写法是使用 String[]
数组:
public static void main(String[] args) {
// 处理参数逻辑
}
从 Java 5 开始支持 varargs(可变参数),所以也可以写成这样:
public static void main(String... args) {
// 同样可以正常接收参数
}
⚠️ 两种写法在底层完全等价,只是语法糖不同。选哪个纯属个人偏好,团队统一即可。
关键点:
args
数组中保存了所有传入的命令行参数,顺序与输入一致- 数组不包含程序名或 JVM 参数(这点和 C/C++ 不同)
- 要获取参数数量?直接用
args.length
举个例子,打印参数个数和内容:
public static void main(String[] args) {
System.out.println("Argument count: " + args.length);
for (int i = 0; i < args.length; i++) {
System.out.println("Argument " + i + ": " + args[i]);
}
}
运行时传参 Hello World!
,输出如下:
Argument count: 2
Argument 0: Hello
Argument 1: World!
简单粗暴,一目了然。
3. 命令行参数的传递方式
有了能处理参数的程序,接下来就是怎么传进去。下面列出主流方式,涵盖本地调试和生产部署。
3.1. 直接使用命令行
这是最原始也最通用的方式。
假设你有一个类 com.baeldung.commandlinearguments.CliExample
,编译后可以直接运行:
java com.baeldung.commandlinearguments.CliExample
输出:
Argument count: 0
加上参数试试:
java com.baeldung.commandlinearguments.CliExample Hello World!
输出:
Argument count: 2
Argument 0: Hello
Argument 1: World!
实际项目中更多是以 JAR 包形式发布。比如你打包为 cli-example.jar
,并在 MANIFEST.MF
中指定了 Main-Class。
无参运行:
java -jar cli-example.jar
带参运行:
java -jar cli-example.jar Hello World!
输出结果同上。
✅ 重点提醒:
java
命令后、类名或 JAR 名之前的参数 → 给 JVM 的(如-Xmx
,-Dproperty=value
)- 类名/JAR 名之后的参数 → 给应用程序的(即
main(String[] args)
接收到的)
别搞混了,否则容易踩坑。
3.2. Eclipse 中配置参数
开发阶段用 IDE 调试最方便。Eclipse 通过 Run Configuration 管理启动参数。
操作路径:
- 右键点击
main
方法 - 选择
Run As > Java Application
首次运行会自动生成默认配置。接着修改参数:
👉 菜单栏:Run > Run Configurations…
👉 切换到 Arguments
标签页
👉 在 Program arguments
输入框中填入你的参数,例如:--env dev --port 8080
保存后点击 Run,参数就能顺利传入。
3.3. IntelliJ IDEA 中配置参数
IntelliJ 的流程类似,叫法更简洁:Run/Debug Configurations。
操作步骤:
- 右键
main
方法 →Run 'CliExample.main()'
- 这会创建一个默认配置并执行一次
- 再次修改:
Run > Edit Configurations…
- 找到
Program arguments
输入框,填写参数
✅ 小技巧:支持变量占位符,比如 $APPLICATION_ENV$
,适合多环境切换。
改完点 OK,然后点绿色运行按钮即可生效。
3.4. NetBeans 中配置参数
NetBeans 的流程也大同小异。
先运行一次:
- 右键
main
方法 →Run File
这会生成运行配置。然后进行参数设置:
👉 菜单:Run > Set Project Configuration > Customize…
👉 左侧选择 Run
👉 在 Arguments
文本框中输入参数
确认后重新运行,参数即可生效。
4. 使用第三方库处理复杂参数
⚠️ 当你的命令行需求变复杂时(比如支持 --help
、--verbose
、子命令、类型转换、必填校验等),手动解析 args[]
就显得力不从心了。
这时候建议上专门的 CLI 框架,避免重复造轮子。
市面上主流的两个选择:
- ✅ Picocli:轻量、高性能、注解驱动,支持自动生成 help 文档、bash 补全等,非常适合独立工具类应用
- ✅ Spring Shell:如果你已经在用 Spring 生态,想做个交互式 CLI 工具,这是天然之选
举个 Picocli 的例子(示意):
@Command(name = "git", description = "a Git-like example")
public class Git implements Callable<Integer> {
@Option(names = "--help", usageHelp = true)
private boolean helpRequested;
@Option(names = "-c", description = "commit message")
private String commitMessage;
public Integer call() {
if (commitMessage != null) {
System.out.println("Committing with message: " + commitMessage);
}
return 0;
}
}
一行注解搞定参数绑定,还能自动输出 help,开发效率提升不止一倍。
❌ 别再手撕 for-loop
解析 args
了,那是远古时代的做法。
5. 总结
main(String[] args)
是接收命令行参数的标准方式,args
只包含用户参数,不含程序名- 开发时可通过 IDE(Eclipse/IntelliJ/NetBeans)配置
Program arguments
快速测试 - 生产环境常用
java -jar app.jar arg1 arg2
形式传参 - 参数位置很重要:JVM 参数在前,应用参数在后
- 复杂场景务必使用 Picocli 或 Spring Shell 这类成熟框架,别自己折腾
示例代码已托管至 GitHub:https://github.com/baeldung/core-java-modules/tree/master/core-java-lang-2
需要快速集成 CLI 功能的同学可以直接拉下来参考,少走弯路。