如何通过Gradle插件为scratch source set添加对main源码集的依赖
实现方案
你可以直接在插件的apply逻辑中按以下方式实现,以下分别给出Groovy和Kotlin两种语言编写插件的示例:
Groovy 插件实现
import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.tasks.SourceSet import org.gradle.api.tasks.SourceSetContainer class ScratchPlugin implements Plugin<Project> { void apply(Project project) { // 预先应用Java插件,确保SourceSet相关能力可用 project.pluginManager.apply('java') SourceSetContainer sourceSets = project.extensions.getByType(SourceSetContainer) // 注册scratch源码集,如果你已经实现过这步可以直接跳过 SourceSet scratchSourceSet = sourceSets.create('scratch') { java.srcDir 'src/scratch/java' resources.srcDir 'src/scratch/resources' } // 等价于构建文件中声明的scratchImplementation依赖配置 project.dependencies.add( scratchSourceSet.implementationConfigurationName, sourceSets.named('main').get().output ) } }
Kotlin 插件实现
import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.tasks.SourceSet import org.gradle.api.tasks.SourceSetContainer class ScratchPlugin : Plugin<Project> { override fun apply(project: Project) { // 预先应用Java插件,确保SourceSet相关能力可用 project.pluginManager.apply("java") val sourceSets = project.extensions.getByType(SourceSetContainer::class.java) // 注册scratch源码集,如果你已经实现过这步可以直接跳过 val scratchSourceSet = sourceSets.create("scratch") { it.java.srcDir("src/scratch/java") it.resources.srcDir("src/scratch/resources") } // 等价于构建文件中声明的scratchImplementation依赖配置 project.dependencies.add( scratchSourceSet.implementationConfigurationName, sourceSets.named("main").get().output ) } }
注意事项
- 建议使用
scratchSourceSet.implementationConfigurationName获取配置名,而非硬编码"scratchImplementation",可以更好兼容不同Gradle版本的配置命名规则 - 如果你开发的是针对Java生态其他插件(比如java-library、kotlin-jvm)的扩展,只需要替换apply的插件ID即可,SourceSet相关逻辑完全通用
内容的提问来源于stack exchange,提问作者Brad Mace
相关产品推荐
相关产品推荐

