You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java主函数中获取--argumentName=argumentValue格式的运行时参数?

解决Java命令行参数解析问题

我来帮你搞定这个需求——你当前的代码用System.getProperty()是读取JVM的系统属性(比如启动时用-D参数传递的),但你想要用--argumentName=argumentValue的形式传参,这类参数默认会被放到main方法的args数组里,所以得做些小处理才能让System.getProperty()拿到值,或者直接解析args来使用。下面给你两种可行的方案:

方案1:直接修改启动命令(最简单)

如果可以调整程序的启动方式,直接用JVM自带的-D参数传递系统属性,这样你现有的代码完全不用改,就能正常输出参数值。

启动命令示例:

java TestArguments -DargumentA=valueA -DargumentB=valueB -DargumentC=valueC

这样运行后,System.getProperty("argumentA")就会直接返回valueA,完美适配你现有的代码逻辑。

方案2:解析--key=value格式的命令行参数

如果必须用--argumentName=argumentValue的形式传参,那我们可以在main方法开头先解析args数组,把符合格式的参数转换成系统属性,或者自己存到Map里使用。

方式2.1:解析后设置为系统属性

这种方式可以让你继续用System.getProperty()获取值,无需修改后续的代码:

public class TestArguments {
    public static void main(String[] args) {
        // 遍历并解析所有--key=value格式的参数
        for (String arg : args) {
            if (arg.startsWith("--")) {
                // 去掉开头的--,然后按=分割(最多分割1次,避免值里包含=的情况)
                String[] keyValuePair = arg.substring(2).split("=", 2);
                if (keyValuePair.length == 2) {
                    String key = keyValuePair[0];
                    String value = keyValuePair[1];
                    // 设置为系统属性
                    System.setProperty(key, value);
                }
            }
        }

        // 原代码无需修改,直接获取值
        System.out.println(System.getProperty("argumentA"));
        System.out.println(System.getProperty("argumentB"));
        System.out.println(System.getProperty("argumentC"));
        System.out.println(System.getProperty("argumentD"));
    }
}

启动命令示例:

java TestArguments --argumentA=hello --argumentB=world --argumentC=foo=bar

这里argumentC的值会是foo=bar,因为我们用split("=", 2)限制了只分割一次,能兼容值里包含=的场景。

方式2.2:解析后存入Map(更灵活)

如果你不想污染系统属性,也可以把解析后的参数存入一个Map,直接从Map中取值:

import java.util.HashMap;
import java.util.Map;

public class TestArguments {
    public static void main(String[] args) {
        Map<String, String> commandLineParams = new HashMap<>();
        
        for (String arg : args) {
            if (arg.startsWith("--")) {
                String[] keyValuePair = arg.substring(2).split("=", 2);
                if (keyValuePair.length == 2) {
                    commandLineParams.put(keyValuePair[0], keyValuePair[1]);
                }
            }
        }

        // 直接从Map获取参数值
        System.out.println(commandLineParams.get("argumentA"));
        System.out.println(commandLineParams.get("argumentB"));
        System.out.println(commandLineParams.get("argumentC"));
        System.out.println(commandLineParams.get("argumentD"));
    }
}

这种方式更适合只在当前程序内使用这些参数的场景,不会影响其他依赖系统属性的代码。

小提示

  • 如果遇到格式错误的参数(比如--argumentX没有值,或者没有=),可以根据需求添加错误提示逻辑;
  • 如果存在重复的参数名,后面的参数会覆盖前面的,这是解析逻辑的默认行为,你可以根据需要调整。

内容的提问来源于stack exchange,提问作者Kyle Bridenstine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:10:15