java启动springboot项目前根据环境变量动态改编yaml文件的变量值
需求:在学习FC时,启动一个springboot项目时需要由用户填写自己的某些特殊变量,解决方案是在FC中由用户自己添加环境变量,通过java代码获取到环境中的环境变量,在springboot启动前注入到yaml文件中。
·
需求:在学习FC时,启动一个springboot项目时需要由用户填写自己的某些特殊变量,解决方案是在FC中由用户自己添加环境变量,通过java代码获取到环境中的环境变量,在springboot启动前注入到yaml文件中。
1.java获取环境变量
环境变量:环境变量(Environment Variables)是计算机操作系统中存储一些动态值的变量,这些值可以影响运行中的进程和程序的行为。环境变量通常以键-值对的形式存在,并可以在操作系统的命令行界面或者代码中进行设置和访问。
java提供了两种获取环境变量的方法。
- System.getenv()
- 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);
}
}
}
更多推荐
已为社区贡献6条内容
所有评论(0)