如何使用 gradle 任务将 .yml 转换为 .properties?

Blo*_*ops 1 spring yaml gradle spring-boot

Spring 唯一支持的 i18n 格式是 .properties 和 .xml,但这并不是真正的最佳选择。我想要的是有一个复杂的 Yaml 文件(messages.yml 和 messages_xx.yml),在 Gradle 任务中转换为 .properties,这样我就可以在 Build 任务之前将其排队。

例如,messages.yml 如下所示:

group1:
  group2:
    group3:
      message1: hello
      message2: how are you?
    group4:
      message3: good
  group5:
    group6:
      message4: let's party
Run Code Online (Sandbox Code Playgroud)

输出 .properties 将是:

group1.group2.group3.message1: hello
group1.group2.group3.message2: how are you?
group1.group2.group4.message3: good
group1.group5.group6.message4: let's party
Run Code Online (Sandbox Code Playgroud)

有办法实现这一点吗?我没有找到现有的转换器。

Edw*_*ann 7

import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Map;
import java.util.TreeMap;

import org.yaml.snakeyaml.Yaml;


public class YamlBackToProperties {
    public static void main(String[] args) throws IOException {

        Yaml yaml = new Yaml();
        try (InputStream in = Files.newInputStream(Paths.get("test.yml"))) {

            TreeMap<String, Map<String, Object>> config = yaml.loadAs(in, TreeMap.class);
            System.out.println(String.format("%s%n\nConverts to Properties:%n%n%s", config.toString(), toProperties(config)));
        }
    }

    private static String toProperties(TreeMap<String, Map<String, Object>> config) {

        StringBuilder sb = new StringBuilder();

        for (String key : config.keySet()) {

            sb.append(toString(key, config.get(key)));
        }

        return sb.toString();
    }

    private static String toString(String key, Map<String, Object> map) {

        StringBuilder sb = new StringBuilder();

        for (String mapKey : map.keySet()) {

            if (map.get(mapKey) instanceof Map) {
                sb.append(toString(String.format("%s.%s", key, mapKey), (Map<String, Object>) map.get(mapKey)));
            } else {
                sb.append(String.format("%s.%s=%s%n", key, mapKey, map.get(mapKey).toString()));
            }
        }

        return sb.toString();
    }
}
Run Code Online (Sandbox Code Playgroud)