Gradle插件中Groovy DSL的SourceSet定义转Kotlin DSL实现方案
Gradle插件Kotlin DSL自定义SourceSet实现方案
报错原因
Kotlin是静态类型语言,不支持Groovy DSL的动态属性访问特性,你遇到的sourceSets未解析引用问题,是因为不能直接调用project.sourceSets这类Groovy特有的动态方法,必须显式通过JavaPluginExtension获取SourceSet容器。
完整转换代码
import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.plugins.JavaPluginExtension import org.gradle.api.tasks.SourceSet class JavaConventionsPlugin : Plugin<Project> { // ... private fun scratchConfiguration(project: Project) { // 先获取Java插件扩展,确保项目已应用Java插件 val javaExtension = project.extensions.getByType(JavaPluginExtension::class.java) val sourceSets = javaExtension.sourceSets // 创建自定义scratch源集,Gradle会自动生成对应的编译、运行配置 sourceSets.create("scratch") val mainSourceSet = sourceSets.getByName(SourceSet.MAIN_SOURCE_SET_NAME) val configurations = project.configurations // 配置scratch配置继承主源集的依赖 configurations.named("scratchCompile") { it.extendsFrom(configurations.getByName("mainCompile")) } configurations.named("scratchRuntime") { it.extendsFrom(configurations.getByName("mainRuntime")) } configurations.named("scratchCompileOnly") { it.extendsFrom(configurations.getByName("compileOnly")) } configurations.named("scratchImplementation") { it.extendsFrom(configurations.getByName("implementation")) } configurations.named("scratchRuntimeOnly") { it.extendsFrom(configurations.getByName("runtimeOnly")) } // 声明scratch源集依赖主源集的输出 project.dependencies.add("scratchImplementation", mainSourceSet.output) } }
注意事项
- 调用该方法前需要确保项目已经应用Java插件,否则获取
JavaPluginExtension会抛出异常,可添加前置判断:if (project.plugins.hasPlugin("java")) { scratchConfiguration(project) } - 如果你使用的是较新版本Gradle(7.0+),可以用Kotlin扩展方法简化写法,核心逻辑保持一致。
内容的提问来源于stack exchange,提问作者Brad Mace
相关产品推荐
相关产品推荐

