java启动springboot项目前根据环境变量动态改编yaml文件的变量值

需求:在学习FC时,启动一个springboot项目时需要由用户填写自己的某些特殊变量,解决方案是在FC中由用户自己添加环境变量,通过java代码获取到环境中的环境变量,在springboot启动前注入到yaml文件中。

1.java获取环境变量

环境变量:环境变量(Environment Variables)是计算机操作系统中存储一些动态值的变量,这些值可以影响运行中的进程和程序的行为。环境变量通常以键-值对的形式存在,并可以在操作系统的命令行界面或者代码中进行设置和访问。
java提供了两种获取环境变量的方法。

  1. System.getenv()
  2. System.getProperty()
    我们在这篇文章中使用的是第一种方法。
public static String getEnv(){
        Map<String, String> env = System.getenv();
        return env.get("biz");
    }

System.getenv()获取到所有环境变量的键值对。
env.get(“biz”)获取到key:biz的环境变量。(在这里是一个json列表的String,所以我们需要将这个String转为json)

2.将String转为Json对象

public static JSONObject getJsonObject(String str){
        return JSON.parseObject(str);
    }

使用阿里的两个处理Json的包。

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;

3.修改yaml文件并注入到项目中

在springboot项目启动前,获取到环境变量写入到yml文件中的配置的变量。
这样启动的springboot项目就可以获取到不同的环境变量。
需要SnakeYAML的能力所以需要再Maven中添加SnakeYAML的依赖:

<dependency>
    <groupId>org.yaml</groupId>
    <artifactId>snakeyaml</artifactId>
    <version>1.29</version>
</dependency>

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

public class YamlModifier {
    public static void main(String[] args) {
        String filePath = "application.yml";
        try {
            // 读取YAML文件
            FileInputStream inputStream = new FileInputStream(filePath);
            Yaml yaml = new Yaml();
            Map<String, Object> data = yaml.load(inputStream);

            // 修改YAML文件内容
            modifyYml(data);

            // 写回YAML文件
            writeYml(data, filePath);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void modifyYml(Map<String, Object> data) {
        // 修改YAML文件中的某个值,例如修改数据库配置
        Map<String, Object> spring = (Map<String, Object>) data.get("spring");
        if (spring != null) {
            Map<String, Object> datasource = (Map<String, Object>) spring.get("datasource");
            if (datasource != null) {
                datasource.put("url", "jdbc:mysql://newhost:3306/newdb");
                datasource.put("username", "newuser");
                datasource.put("password", "newpassword");
            }
        }
    }

    private static void writeYml(Map<String, Object> data, String filePath) throws IOException {
        // 将修改后的Map写回YAML文件
        DumperOptions options = new DumperOptions();
        options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
        Yaml yaml = new Yaml(options);
        try (FileWriter writer = new FileWriter(filePath)) {
            yaml.dump(data, writer);
        }
    }
}

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值