如何通过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
相关产品推荐
相关产品推荐

