Android多模块项目Groovy转Kotlin Gradle:共享依赖配置疑问
解决Kotlin Gradle DSL中共享多模块依赖的问题
在Groovy Gradle里直接写独立依赖文件引入的方式,放到Kotlin DSL里会失效,核心原因是Kotlin是静态类型语言,必须明确依赖配置的作用域,不能像Groovy那样隐式识别上下文。下面给两种实用的解决方案:
方案一:使用DependencyHandler扩展函数
这种方式最接近你原来的使用习惯,步骤如下:
- 在项目根目录创建一个
shared-dependencies.kt文件(也可以放在buildSrc/src/main/kotlin下,让所有模块自动可见),内容如下:
import org.gradle.api.artifacts.dsl.DependencyHandler fun DependencyHandler.addSharedDependencies() { // Kotlin依赖 implementation(Dependencies.Kotlin.stdlibJdk7) implementation(Dependencies.Kotlin.coroutineCore) // Dagger依赖 implementation(Dependencies.Dagger.core) kapt(Dependencies.Dagger.coreCompiler) // 日志依赖 implementation(Dependencies.Logging.timber) implementation(Dependencies.Logging.slf4j) implementation(Dependencies.Logging.slf4jTimber) // Shimmer依赖 implementation(Dependencies.Shimmer.shimmer) }
- 在需要引入共享依赖的模块
build.gradle.kts中,直接在dependencies块里调用这个扩展函数:
dependencies { addSharedDependencies() // 模块自身的其他依赖可以继续加在这里 }
方案二:使用预编译脚本插件(适合大型项目)
如果项目模块较多,推荐把共享依赖做成Gradle插件,复用性更强:
- 在项目根目录创建
buildSrc目录(Gradle会自动识别这个目录作为构建脚本的源码目录),然后创建如下结构:
buildSrc/ ├── src/ │ └── main/ │ ├── kotlin/ │ │ └── com/ │ │ └── yourproject/ │ │ └── SharedDependenciesPlugin.kt │ └── resources/ │ └── META-INF/ │ └── gradle-plugins/ │ └── com.yourproject.shared-dependencies.properties └── build.gradle.kts
- 在
SharedDependenciesPlugin.kt中编写插件逻辑:
import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.kotlin.dsl.dependencies class SharedDependenciesPlugin : Plugin<Project> { override fun apply(project: Project) { project.dependencies { // 这里写入所有共享依赖 implementation(Dependencies.Kotlin.stdlibJdk7) implementation(Dependencies.Kotlin.coroutineCore) implementation(Dependencies.Dagger.core) kapt(Dependencies.Dagger.coreCompiler) implementation(Dependencies.Logging.timber) implementation(Dependencies.Logging.slf4j) implementation(Dependencies.Logging.slf4jTimber) implementation(Dependencies.Shimmer.shimmer) } } }
- 在
com.yourproject.shared-dependencies.properties中指定插件实现类:
implementation-class=com.yourproject.SharedDependenciesPlugin
- 在需要引入共享依赖的模块
build.gradle.kts中,直接引入插件即可:
plugins { id("com.yourproject.shared-dependencies") // 其他模块需要的插件,比如com.android.library等 }
额外注意
如果你的Dependencies常量类是在Groovy里定义的,需要把它也转换成Kotlin对象,比如:
object Dependencies { object Kotlin { val stdlibJdk7 = "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0" val coroutineCore = "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3" } // 其他依赖组类似 }
内容的提问来源于stack exchange,提问作者Ludiras
相关产品推荐
相关产品推荐

