批量替换yaml文件url字段
方法入口
import java.util.Arrays;
import java.util.List;public class YamlUpdaterMain {public static void main(String[] args) {List<String> paths = Arrays.asList("D:\\git_project\\auth\\auth-server\\src\\main\\resources\\application.yaml","D:\\git_project\\datatransfer\\datatransfer-server\\src\\main\\resources\\application.yaml","D:\\git_project\\oss\\oss-server\\src\\main\\resources\\application.yaml","D:\\git_project\\push\\push-server\\src\\main\\resources\\application.yaml","D:\\git_project\\system\\system-server\\src\\main\\resources\\application.yaml","D:\\git_project\\platcap\\platcap-server\\src\\main\\resources\\application.yaml","D:\\git_project\\foreign\\foreign-server\\src\\main\\resources\\application.yaml");String url = "10.20.120.70";System.out.println("========================================");System.out.println(" YAML URL 批量更新工具 ");System.out.println("========================================");System.out.println("目标 URL: " + url);System.out.println("待处理文件数: " + paths.size());System.out.println("----------------------------------------");YamlUpdater updater = new YamlUpdater();updater.updateServerUrl(paths, url);System.out.println("\n========================================");System.out.println(" 所有文件处理完成 ");System.out.println("========================================");}
}
逻辑类
import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.Yaml;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
import java.util.Map;public class YamlUpdater {/*** 批量更新一系列 application.yaml 文件中的 server.url 属性。** @param filePaths 包含所有 application.yaml 文件路径的列表。* @param newUrl 要设置的新 URL 值 (例如 '192.168.10.55')。*/public void updateServerUrl(List<String> filePaths, String newUrl) {Yaml yaml = createYamlInstance();int i = 1;for (String path : filePaths) {System.out.println(i++ + "\n--- 处理文件: " + path + " ---");File file = new File(path);if (!file.exists()) {System.err.println(" ❌ 错误: 文件未找到。跳过。");continue;}try (FileInputStream inputStream = new FileInputStream(file)) {// 1. 读取并加载 YAML 文件内容@SuppressWarnings("unchecked")Map<String, Object> data = yaml.load(inputStream);// 2. 检查并修改 'server.url'// 检查顶层 key: serverif (data != null && data.containsKey("server")) {@SuppressWarnings("unchecked")Map<String, Object> serverConfig = (Map<String, Object>) data.get("server");// 检查次级 key: urlif (serverConfig != null && serverConfig.containsKey("url")) {Object oldUrl = serverConfig.get("url");serverConfig.put("url", newUrl); // 替换值System.out.println(" ✅ 成功替换 server.url: '" + oldUrl + "' -> '" + newUrl + "'");// 3. 将修改后的内容写回文件try (FileWriter writer = new FileWriter(file)) {yaml.dump(data, writer);System.out.println(" ✅ 文件已成功更新并保存。");}} else {System.out.println(" ⚠️ 警告: 未找到 'server.url' 路径。跳过。");}} else {System.out.println(" ⚠️ 警告: 未找到顶层 'server' 节点。跳过。");}} catch (IOException e) {System.err.println(" ❌ 错误: 文件读写失败,详情: " + e.getMessage());} catch (Exception e) {System.err.println(" ❌ 错误: YAML 解析或处理失败,详情: " + e.getMessage());}}}/*** 配置 SnakeYAML 的 DumperOptions,以保持输出的 YAML 格式清晰且与 Spring Boot 兼容。*/private Yaml createYamlInstance() {DumperOptions options = new DumperOptions();// 设置默认样式为块状 (Block Style),这使得 YAML 更易读options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);// 缩进设置为2个空格,符合 Spring Boot 常见规范options.setIndent(2);// 禁用排序,保持 key 的原始顺序options.setPrettyFlow(true);options.setCanonical(false);// 允许 unicode 字符输出options.setAllowUnicode(true);return new Yaml(options);}}