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 管理启动参数。

操作路径:

  1. 右键点击 main 方法
  2. 选择 Run As > Java Application

首次运行会自动生成默认配置。接着修改参数:

👉 菜单栏:Run > Run Configurations…
👉 切换到 Arguments 标签页
👉 在 Program arguments 输入框中填入你的参数,例如:--env dev --port 8080

eclipse run

eclipse configure

保存后点击 Run,参数就能顺利传入。


3.3. IntelliJ IDEA 中配置参数

IntelliJ 的流程类似,叫法更简洁:Run/Debug Configurations

操作步骤:

  1. 右键 main 方法 → Run 'CliExample.main()'
  2. 这会创建一个默认配置并执行一次
  3. 再次修改:Run > Edit Configurations…
  4. 找到 Program arguments 输入框,填写参数

intellij run

intellij configure

✅ 小技巧:支持变量占位符,比如 $APPLICATION_ENV$,适合多环境切换。

改完点 OK,然后点绿色运行按钮即可生效。


3.4. NetBeans 中配置参数

NetBeans 的流程也大同小异。

先运行一次:

  1. 右键 main 方法 → Run File

这会生成运行配置。然后进行参数设置:

👉 菜单:Run > Set Project Configuration > Customize…
👉 左侧选择 Run
👉 在 Arguments 文本框中输入参数

netbeans run

netbeans configure

确认后重新运行,参数即可生效。


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 功能的同学可以直接拉下来参考,少走弯路。


原始标题:Command-Line Arguments in Java | Baeldung