JVM应用构建时自动生成version.properties文件的配置问题
解决Gradle生成version.properties被清理的问题
你的问题核心是直接将文件写入了processResources任务的输出目录,而processResources执行时会先清空该目录,再复制原始资源,导致你生成的文件被覆盖删除。下面是两种靠谱的解决方式:
方式一:用生成目录+SourceSet关联(推荐)
修改根项目的build.gradle.kts,把生成文件的目录改成Gradle规范的生成资源目录,再将这个目录加入到资源源集合中,让processResources自动把它打包进去:
allprojects { //... tasks.register("createVersionPropertiesFile") { group = "build" // 指定生成到单独的目录,避免被processResources清理 val generatedResourcesDir = File("$buildDir/generated/resources/version") val versionFile = File(generatedResourcesDir, "version.properties") // 定义任务输出,让Gradle支持增量构建 outputs.file(versionFile) doLast { generatedResourcesDir.mkdirs() versionFile.writeText("version=${project.version}") } } // 将生成目录添加到main资源的源目录中 sourceSets { main { resources { srcDir(tasks["createVersionPropertiesFile"].outputs.files) } } } // 确保processResources执行前先生成文件 tasks.processResources { dependsOn(tasks["createVersionPropertiesFile"]) } }
为什么这样有效:
processResources只会清理自己的输出目录(build/resources/main),不会碰我们自定义的生成目录- 把生成目录加入
sourceSets.main.resources.srcDirs后,processResources会自动将该目录下的文件和src/main/resources的文件一起复制到输出目录,不会丢失
方式二:直接在processResources中生成(更简洁)
如果不需要单独的任务,可以直接在processResources任务中嵌入生成逻辑,省去单独注册任务的步骤:
// 在应用模块的build.gradle.kts中配置 tasks.processResources { // 直接生成version.properties到输出目录 into("") { from(temporaryDir) { val versionFile = File(temporaryDir, "version.properties") versionFile.writeText("version=${project.version}") rename { "version.properties" } } } }
这种方式利用Gradle的临时目录生成文件,再通过from加入到资源处理流程中,避免了目录冲突和被清理的问题。
内容的提问来源于stack exchange,提问作者Tenfour04
相关产品推荐
相关产品推荐

