Gradle:将KAPT生成的Kotlin源码添加到sources JAR的正确方式
解决KAPT生成代码打包进sources.jar及IDEA重复内容根问题
- 别手动把KAPT生成目录加到main源集里,这就是循环依赖和重复根警告的根源。Gradle的KAPT插件已经自动管理了生成代码的源集,直接用
kapt.main.generatedSourcesDir就能拿到对应目录。 - 配置
sourcesJar任务时,直接把KAPT生成的源码加进去就行,不用动main源集:
tasks.withType(Jar).named("sourcesJar") { from sourceSets.main.allSource // 加入KAPT生成的源码目录 from kapt.main.generatedSourcesDir }
要是想更精准,只打包Java和Kotlin源码,可以这么写:
tasks.named("sourcesJar") { from sourceSets.main.java from sourceSets.main.kotlin from fileTree(kapt.main.generatedSourcesDir) { include "**/*.java" include "**/*.kt" } }
- 要是你用的是Android项目,配置逻辑差不多,注意用
android.sourceSets.main:
android { // ... 其他项目配置 sourceSets { main { // 绝对不要在这里加kapt生成目录! } } } tasks.named("sourcesJar") { from android.sourceSets.main.java.srcDirs from android.sourceSets.main.kotlin.srcDirs from kapt.main.generatedSourcesDir }
这么做的好处:
- 不碰main源集,彻底避免循环依赖问题
- IDEA不会再报“重复内容根”,因为没手动把生成目录塞进main源集
- sourcesJar能准确打包KAPT生成的代码
最后检查下之前的构建脚本,要是有手动添加生成目录到main源集的代码,比如下面这种,一定要删掉:
sourceSets.main.java.srcDirs += file("build/generated/source/kapt/main")
内容的提问来源于stack exchange,提问作者Kirill Gagarski
相关产品推荐
相关产品推荐

