问题分析
Sonar是一个静态代码扫描工具,默认根据源代码分析代码质量和潜在的问题。lombok是一个字节码增强工具,通过在编译期修改java class字节码实现简化代码的目的。所以默认情况sonar会将使用lombok @Data等注解的类识别为 代码坏味道 。SonarJava是sonar默认提供的Java语言分析器。SonarJava4.12以后增加了字节码分析能力,但到5.1才解决lombok字节码增强的分析。
升级SonarJava
我们安装的SonarQube是6.7,默认使用的是SonarJava4.12.要升级SonarJava,5.14就不支持SonarSource6.7,如果不想升级SonarQube,我们只能使用SonarJava5.13。
可以通过sonarsource离线下载SonarJava。把${SonarQube安装目录}/extensions/plugins下面的旧版的4.12版本的sonar-java替换成5.13版本的。然后重启SonarQube即可。
增加SonarJava依赖的jar包
SonarJava字节码分析依赖两个重要的配置参数,sonar.java.binaries和sonar.java.libraries。
Key | Value |
---|---|
sonar.java.binaries (required) | 待分析的源代码编译后的路径,即我们自己编写的代码的class文件路径 |
sonar.java.libraries | 代码依赖的第三方jar包,即我们代码的依赖仓库 |
gradle编译时依赖的jar包一般不在当前编译路径下,我们需要拷贝过来供SonarJava分析使用。
修改工程根目录下的build.gradle
在subprojects下增加copyDependencies task
subprojects{
// ...
task copyDependencies(type: Sync){
from configurations.compileClasspath
from configurations.compileOnly
into 'build/dependencies'
}
}
拷贝configurations.compileOnly非常重要,因为 lombok is 编译期依赖。
sonar集成到Jenkins
在Jenkins上安装sonar插件
系统配置 -> 配置sonar服务器地址
配置需要添加sonar静态检查的Jenkins Job
- 构建环境时点选 “Prepare SonarQube Scanner environment”
- 在构建后添加 “Execute SonarQube Scanner”
- 在task中增加 copyDependencies
clean build -x test -Pprofile=prepare publish copyDependencies
- 并在Analysis properties中添加如下配置:
sonar.projectKey= xxx
sonar.projectName= xxx
sonar.projectVersion=1.0.0
sonar.sources=src/
sonar.sourceEncoding=UTF-8
如果分成多个module
sonar.projectKey=xxx
sonar.projectKey=xxx
sonar.projectVersion=1.0
sonar.sourceEncoding=UTF-8
sonar.language=java
sonar.sources=./src/main/java
sonar.java.binaries=./build/classes/main
sonar.java.libraries=./build/dependencies/*.jar
sonar.modules=base, api, manage
base.sonar.projectBaseDir=base/
api.sonar.projectBaseDir=core-api/
manage.sonar.projectBaseDir=manage-server/
配置说明
- sonar.sources配置的是子工程的相对路径,将整个工程按子工程迭代分析扫描。
- sonar.java.libraries也是相对路径,这个路径中的文件是由copyDependencies拷贝到./build/dependencies中的。其中最重要的一个文件是lomok.jar,没有这个文件依然还会报错“[java] UnUsed “private” field should be removed”.
参考: