Gradle多项目构建时合并reference.conf配置文件的方案咨询
解决Gradle多项目构建Fat Jar时合并reference.conf的问题
项目结构
app |-reference.conf lib1 | |- reference.conf lib2 |-reference.conf lib3 |- reference.conf
可用插件方案
社区有专门处理Typesafe Config合并的Gradle插件gradle-typesafe-config-plugin,它支持按项目层级自动合并reference.conf,并能控制合并顺序保证底层配置优先。配合Shadow插件构建Fat Jar的配置示例如下:
plugins { id 'com.github.johnrengelman.shadow' version '8.1.1' id 'net.ltgt.gradle.typesafe-config' version '1.1.0' } typesafeConfig { merge { // 按项目层级深度排序,底层项目配置后写入(覆盖顶层) order = { project -> project.path.split(':').size() } include 'reference.conf' } } shadowJar { from typesafeConfig.merge.outputFile exclude 'reference.conf' // 排除所有原配置文件 }
自定义实现方案
如果不想依赖第三方插件,可通过自定义Gradle任务实现需求:
步骤1:创建合并配置文件的任务
在根项目build.gradle中添加任务,收集所有reference.conf并按层级排序合并:
task mergeReferenceConf(type: Copy) { // 收集所有存在的reference.conf文件 def confFiles = allprojects.collect { project -> project.file('src/main/resources/reference.conf') }.findAll { it.exists() } // 按项目层级深度排序:深度越大(越底层)越靠后,保证底层配置覆盖顶层 confFiles.sort { file -> def project = allprojects.find { it.file('src/main/resources/reference.conf') == file } project.path.split(':').size() } // 合并为单个reference.conf到临时目录 into "${buildDir}/tmp/mergedConf" from confFiles eachFile { file -> file.path = 'reference.conf' } duplicatesStrategy = DuplicatesStrategy.INCLUDE }
步骤2:修改Fat Jar任务(以Shadow为例)
让Shadow Jar使用合并后的配置文件,排除原有配置:
plugins { id 'com.github.johnrengelman.shadow' version '8.1.1' } shadowJar { dependsOn mergeReferenceConf from mergeReferenceConf.outputs.files exclude 'reference.conf' // 其他Fat Jar相关配置... }
关键说明
- 排序逻辑:通过项目路径的层级深度判断优先级,底层项目配置会被追加到合并文件末尾。由于HOCON语法中后出现的配置会覆盖先出现的同名项,以此保证底层库配置优先生效。
- 文件处理:非
.conf格式的文件会按默认规则打包,仅**/*.conf文件会被合并为单个reference.conf。
内容的提问来源于stack exchange,提问作者Raiv
相关产品推荐
相关产品推荐

