从Sonar 5.6升级到6.7.3后Maven构建失败,sonar.java.binaries是否必填?
SonarQube 6.7.3与Maven插件:sonar.java.binaries属性必填问题解析
我来帮你梳理下这个问题,刚好对SonarQube 6.x和Maven插件的适配问题比较熟悉:
核心结论:不是所有场景都必须指定,但你的情况大概率需要显式配置
SonarQube从6.x版本开始,Java代码分析模块对编译后的类文件依赖更严格,尤其是6.7.x这个LTS版本。虽然官方文档说Maven项目的插件应该能自动识别target/classes目录,但在以下几种场景下,你必须手动指定sonar.java.binaries:
- Jenkins构建流程中,Sonar扫描步骤和
mvn compile步骤是分开执行的,或者中间有清理target目录的操作,导致扫描时找不到编译后的类文件; - 你使用的
sonar-maven-plugin:3.0.2版本太老,和SonarQube 6.7.3的兼容性不佳,自动识别类文件目录的逻辑存在缺陷。
具体解决方案
确保Sonar扫描前执行编译步骤
在Jenkins的构建命令里,把mvn compile和Sonar扫描放在同一个阶段,比如:mvn compile sonar:sonar这样插件大概率能自动识别
target/classes,不需要额外配置属性。显式配置sonar.java.binaries属性
如果编译和扫描步骤无法合并,或者自动识别失效,可以在Maven插件配置里添加属性,或者在构建命令里传参:- 插件配置方式(同时建议升级插件到兼容版本):
<plugin> <groupId>org.sonarsource.scanner.maven</groupId> <artifactId>sonar-maven-plugin</artifactId> <version>3.4.0.905</version> <!-- 这个版本和SonarQube 6.7.3完美兼容 --> <configuration> <sonar.java.binaries>${project.build.directory}/classes</sonar.java.binaries> <!-- 如果项目有测试类需要分析,可追加:<sonar.java.test.binaries>${project.build.directory}/test-classes</sonar.java.test.binaries> --> </configuration> </plugin> - Jenkins命令传参方式:
mvn sonar:sonar -Dsonar.java.binaries=target/classes
- 插件配置方式(同时建议升级插件到兼容版本):
升级sonar-maven-plugin版本
你当前用的3.0.2是2016年的版本,和2018年发布的SonarQube 6.7.3存在适配间隙。升级到3.4.0.905(Sonar官方推荐和6.7.x匹配的插件版本),不仅能解决自动识别类文件的问题,还能修复一些其他兼容性bug。
内容的提问来源于stack exchange,提问作者arkay
相关产品推荐
相关产品推荐

