sonar扫描处理lombok问题

问题分析

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”
  1. 在task中增加 copyDependencies
clean build -x test -Pprofile=prepare publish copyDependencies
  1. 并在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/

配置说明

  1. sonar.sources配置的是子工程的相对路径,将整个工程按子工程迭代分析扫描。
  2. sonar.java.libraries也是相对路径,这个路径中的文件是由copyDependencies拷贝到./build/dependencies中的。其中最重要的一个文件是lomok.jar,没有这个文件依然还会报错“[java] UnUsed “private” field should be removed”.

参考:

  1. Maven, SonarQube, JaCoCo, Lombok and TeamCity
  2. 使用Sonar集成Jenkins进行代码静态检查
  3. Getting meaningful coverage results in SonarQube when using JaCoCo and Lombok
  4. SonarQube

你可能感兴趣的:(开发工具)