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

如何通过VM参数加载Yaml文件?非Spring Boot可执行Jar场景

通过VM参数加载非固定目录的Yaml文件(非Spring Boot场景)

当然可以做到!虽然Java本身没有像log4j那样提供直接加载Yaml的原生VM参数,但我们可以自己动手实现类似的效果——通过自定义VM参数传递配置文件路径,再在代码里手动加载解析。刚好你需要的是普通可执行Jar的场景,和Spring Boot的自动配置逻辑无关,下面是具体的实现步骤:

1. 启动Jar时传递自定义VM参数

运行你的可执行Jar时,用-D参数指定Yaml文件的路径(支持绝对路径或相对路径),示例命令如下:

java -jar your-application.jar -Dapp.config.path=/opt/configs/your-config.yml

这里的app.config.path是自定义的参数名,你可以根据自己的业务需求改成更贴合的名字,比如custom.yaml.path。

2. 在代码中读取参数并解析Yaml文件

接下来需要在你的Java代码里获取这个VM参数,然后借助第三方Yaml解析库(最常用的是SnakeYAML)来加载并解析文件内容。

第一步:添加SnakeYAML依赖

如果是Maven项目,在pom.xml中添加依赖:

<dependency>
    <groupId>org.yaml</groupId>
    <artifactId>snakeyaml</artifactId>
    <version>2.2</version> <!-- 建议使用最新稳定版本 -->
</dependency>

如果是Gradle项目,对应的依赖配置是:

implementation 'org.yaml:snakeyaml:2.2'

第二步:编写加载配置的代码

示例代码如下,你可以根据自己的项目结构调整:

import org.yaml.snakeyaml.Yaml;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Map;

public class YamlConfigLoader {
    public static void main(String[] args) {
        // 从VM参数中读取配置文件路径
        String configFilePath = System.getProperty("app.config.path");
        
        // 校验参数是否存在
        if (configFilePath == null || configFilePath.trim().isEmpty()) {
            throw new IllegalArgumentException("请通过-Dapp.config.path指定Yaml配置文件的路径");
        }

        // 加载并解析Yaml文件
        Yaml yamlParser = new Yaml();
        try (FileInputStream inputStream = new FileInputStream(configFilePath)) {
            // 将Yaml内容解析为Map结构,也可以绑定到自定义实体类
            Map<String, Object> configMap = yamlParser.load(inputStream);
            
            // 示例:读取具体配置项
            String apiUrl = (String) configMap.get("api.base-url");
            int timeout = (Integer) configMap.get("api.timeout");
            
            System.out.println("加载的API地址:" + apiUrl);
            System.out.println("加载的超时时间:" + timeout);
        } catch (IOException e) {
            throw new RuntimeException("加载Yaml配置文件失败,请检查路径是否正确", e);
        }
    }
}

3. 适配非固定目录的场景

因为我们是通过VM参数动态传递路径,不管Yaml文件在哪个目录下——比如用户本地的~/configs/app.yml,或者服务器上的/data/configs/xxx.yml——只要启动Jar时传入正确的路径,代码就能正常加载。如果用相对路径的话,路径是相对于Jar的运行目录,这点需要提醒使用的人注意。

额外小技巧

  • 如果你需要将Yaml内容绑定到自定义的实体类(而不是用Map),可以用SnakeYAML的loadAs方法,比如:
YourConfigClass config = yamlParser.loadAs(inputStream, YourConfigClass.class);

这样更便于类型安全地操作配置项。

  • 可以添加默认路径逻辑:如果VM参数没传,就加载Jar内部默认的Yaml配置,这样更灵活。

内容的提问来源于stack exchange,提问作者The Coder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:51:26