Gradle 8.5+Java21环境下执行spotbugsMain任务显示NO-SOURCE未执行
Gradle SpotBugs任务显示NO-SOURCE问题解决
问题场景
使用Gradle 8.5、Java 21,通过Kotlin DSL编写构建脚本,配置SpotBugs插件后执行gradle spotbugsMain命令,控制台输出NO-SOURCE,任务未实际执行。
当前配置文件如下:
gradle.kts 原配置
import com.github.spotbugs.snom.SpotBugsTask plugins { id("com.github.spotbugs") } spotbugs { group = "Verification" description = "Run Spotbugs on this project." ignoreFailures = false showStackTraces = true showProgress = true maxHeapSize = "1g" } tasks.withType<SpotBugsTask>().configureEach { dependsOn("assemble") classDirs = files("${project.layout.buildDirectory}.absolutePath/build/classes/java/main") sourceDirs = files("${project.layout.buildDirectory}.absolutePath/src/main/java") }
libs.versions.toml 原配置
[versions] spotbugs = "6.0.6" [libraries] spotbugs-gradle = { module = "com.github.spotbugs.snom:spotbugs-gradle-plugin", version.ref = "spotbugs" }
错误原因
- 插件引入方式不匹配:
libs.versions.toml中定义了SpotBugs插件版本,但gradle.kts的plugins块未正确关联该配置,可能导致插件加载异常或版本不一致。 - 路径配置错误:硬编码路径时错误拼接
project.layout.buildDirectory的absolutePath属性,生成的路径格式无效(例如会变成/xxx/build.absolutePath/build/classes/java/main),导致SpotBugs无法找到目标类文件和源码,触发NO-SOURCE提示。
修复方案
1. 统一插件版本管理
在libs.versions.toml中添加plugins节点管理插件版本,再通过别名引入插件:
修改后的 libs.versions.toml
[versions] spotbugs = "6.0.6" [libraries] spotbugs-gradle = { module = "com.github.spotbugs.snom:spotbugs-gradle-plugin", version.ref = "spotbugs" } [plugins] spotbugs = { id = "com.github.spotbugs", version.ref = "spotbugs" }
修改后的 gradle.kts 插件引入部分
plugins { alias(libs.plugins.spotbugs) // 必须添加Java插件,否则无法获取sourceSets相关配置 java }
2. 修正路径配置
使用Gradle内置的sourceSets属性获取标准路径,避免硬编码:
修改后的 gradle.kts SpotBugs任务配置部分
tasks.withType<SpotBugsTask>().configureEach { dependsOn("assemble") // 从sourceSets获取正确的类文件目录和源码目录 classDirs = sourceSets.main.get().output.classesDirs sourceDirs = sourceSets.main.get().java.srcDirs }
完整修正后的 gradle.kts
import com.github.spotbugs.snom.SpotBugsTask plugins { alias(libs.plugins.spotbugs) java } spotbugs { group = "Verification" description = "Run Spotbugs on this project." ignoreFailures = false showStackTraces = true showProgress = true maxHeapSize = "1g" } tasks.withType<SpotBugsTask>().configureEach { dependsOn("assemble") classDirs = sourceSets.main.get().output.classesDirs sourceDirs = sourceSets.main.get().java.srcDirs }
验证执行
执行gradle spotbugsMain命令,SpotBugs会正确识别类文件和源码文件,启动代码扫描任务。
内容的提问来源于stack exchange,提问作者AnnKont
相关产品推荐
相关产品推荐

