Gradle构建失败:找不到'main' SourceSet,无法创建指定任务
问题修复方案
核心问题分析
找不到'main' SourceSet:
- 脚本未正确限定
sourceSets作用域,直接使用sourceSets而非project.sourceSets - 检查Java插件的方式过时,可能误判项目是否具备Java环境
- 目标
:app项目可能未应用Java/Android相关插件,导致不存在mainSourceSet
- 脚本未正确限定
Gradle 9.0兼容性问题:
project.convention.findPlugin(JavaPluginConvention)已废弃,需改用插件存在性检查+扩展获取- 旧版Groovy任务创建语法(
name: ...)在新版Gradle中支持性下降 GradleVersion相关API调用逻辑需适配新版规范
修复步骤
先确认
:app项目的build.gradle中已应用对应插件:
Java项目添加:plugins { id 'java' }Android项目添加:
plugins { id 'com.android.application' }替换初始化脚本为以下修正版本:
def gradlePath = ':app' def runAppTaskName = 'ok.main()' def mainClass = 'com.example.basic1.ok' def javaExePath = mapPath('F:/Andriod/jbr/bin/java.exe') def _workingDir = mapPath('D:/Basic1') def sourceSetName = 'main' def javaModuleName = null import org.gradle.api.plugins.JavaPlugin import org.gradle.api.plugins.JavaPluginExtension import org.gradle.util.GradleVersion allprojects { afterEvaluate { project -> // 检查项目路径匹配且已应用Java插件 if (project.path == gradlePath && project.plugins.hasPlugin(JavaPlugin)) { def javaExt = project.extensions.getByType(JavaPluginExtension) def sourceSet = javaExt.sourceSets.findByName(sourceSetName) // 提前校验SourceSet是否存在 if (sourceSet == null) { project.logger.error("SourceSet '${sourceSetName}' not found in project ${project.path}") return } def overwrite = project.tasks.findByName(runAppTaskName) != null project.tasks.register(runAppTaskName, JavaExec) { task -> if (javaExePath) { task.executable = javaExePath } task.mainClass.set(mainClass) if (_workingDir) { task.workingDir = _workingDir } task.standardInput = System.in if (javaModuleName) { def jarTask = project.tasks.named(sourceSet.jarTaskName) task.classpath = jarTask.map { it.outputs.files } + sourceSet.runtimeClasspath if (GradleVersion.current().baseVersion < GradleVersion.version("6.4")) { task.doFirst { jvmArgs += [ '--module-path', classpath.asPath, '--module', "${javaModuleName}/${mainClass}" ] classpath = project.files() } } else { task.mainModule.set(javaModuleName) } } else { task.classpath = sourceSet.runtimeClasspath } } } } }
关键修正点
- 用
project.plugins.hasPlugin(JavaPlugin)替代过时的convention.findPlugin检查逻辑 - 通过
JavaPluginExtension获取SourceSet,确保作用域和API兼容性 - 使用
tasks.register替代旧版tasks.create,符合Gradle增量构建规范 - 增加SourceSet存在性校验,避免空指针异常
- 调整
mainClass和mainModule为属性设置方式(.set()),适配新版Gradle API
内容的提问来源于stack exchange,提问作者Pratham Patil
相关产品推荐
相关产品推荐

