You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gradle构建失败:找不到'main' SourceSet,无法创建指定任务

问题修复方案

核心问题分析

  1. 找不到'main' SourceSet:

    • 脚本未正确限定sourceSets作用域,直接使用sourceSets而非project.sourceSets
    • 检查Java插件的方式过时,可能误判项目是否具备Java环境
    • 目标:app项目可能未应用Java/Android相关插件,导致不存在main SourceSet
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 00:45:12