如何通过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
相关产品推荐
相关产品推荐

