You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Gradle任务将.yml格式国际化文件转换为.properties?

实现Gradle任务将YAML国际化文件转为Spring支持的.properties格式

绝对有办法搞定!我之前做Spring项目时也嫌弃.properties的扁平格式写起来太繁琐,就自己用Gradle结合SnakeYAML库实现了这个转换需求,完全不需要找现成的转换器。下面是具体的实现步骤和代码:

1. 引入SnakeYAML依赖

首先需要在Gradle的构建脚本中引入SnakeYAML库,它是用来解析YAML文件的核心工具:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'org.yaml:snakeyaml:2.2' // 使用最新稳定版本即可
    }
}

2. 编写转换Gradle任务

接下来创建一个自定义Gradle任务,它会完成以下工作:

  • 扫描指定目录下的所有messages*.yml国际化文件
  • 解析YAML的嵌套结构,将其扁平化为Spring支持的key.subkey=value格式
  • 生成对应的.properties文件
  • 确保转换任务在构建打包前执行

完整任务代码如下:

task convertYamlToProperties {
    // 配置YAML文件所在目录,根据你的项目结构调整
    def yamlResourceDir = file('src/main/resources')
    // 筛选所有messages开头、yml结尾的文件
    def yamlFiles = yamlResourceDir.listFiles({ file -> 
        file.name.startsWith('messages') && file.name.endsWith('.yml') 
    } as FileFilter)

    doLast {
        yamlFiles.each { yamlFile ->
            // 初始化YAML解析器
            def yamlParser = new org.yaml.snakeyaml.Yaml()
            // 解析YAML文件为Map对象
            def yamlData = yamlParser.load(yamlFile.text)

            // 扁平化嵌套的Map结构
            def flatProperties = [:]
            flattenNestedMap(yamlData, '', flatProperties)

            // 生成目标.properties文件名
            def targetPropFileName = yamlFile.name.replace('.yml', '.properties')
            def targetPropFile = new File(yamlResourceDir, targetPropFileName)

            // 以UTF-8编码写入.properties文件,避免中文乱码
            targetPropFile.withWriter('UTF-8') { writer ->
                flatProperties.each { key, value ->
                    writer.writeLine("${key}=${value}")
                }
            }

            println "✅ 成功转换 ${yamlFile.name} -> ${targetPropFileName}"
        }
    }

    // 辅助方法:递归扁平化嵌套Map
    def flattenNestedMap(Map dataMap, String keyPrefix, Map resultMap) {
        dataMap.each { key, value ->
            def fullKey = keyPrefix ? "${keyPrefix}.${key}" : key
            if (value instanceof Map) {
                // 递归处理嵌套子Map
                flattenNestedMap(value, fullKey, resultMap)
            } else if (value instanceof List) {
                // 处理YAML数组,转为Spring支持的index格式(如list[0]=value)
                value.eachWithIndex { item, index ->
                    resultMap["${fullKey}[${index}]"] = item
                }
            } else {
                // 普通键值对直接加入结果
                resultMap[fullKey] = value
            }
        }
    }
}

// 让转换任务在资源处理(processResources)之前执行,确保打包用的是转换后的文件
processResources.dependsOn(convertYamlToProperties)

3. 关键注意事项

  • 编码问题:一定要用UTF-8写入.properties文件,同时在Spring配置中开启UTF-8读取(比如在application.yml中配置spring.messages.encoding=UTF-8),避免中文等非ASCII字符乱码。
  • 数组处理:上面的代码已经支持YAML数组转换,比如menu: [首页, 关于我们]会被转为menu[0]=首页和menu[1]=关于我们,完全符合Spring的国际化数组读取规则。
  • 测试验证:可以先手动执行./gradlew convertYamlToProperties(Windows用gradlew.bat convertYamlToProperties)查看转换结果,确认无误后再执行构建。
  • 版本适配:如果使用Gradle 7+的新语法(Groovy DSL或Kotlin DSL),只需调整依赖引入的方式即可,核心逻辑不变。

内容的提问来源于stack exchange,提问作者Bloops

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:55:17