针对目前Java工程集成SonarQube,主要有两种方式。一种是在Java工程自身是Maven工程的情况下,可直接使用Maven中的sonar插件,快速完成对接。如果不是Maven工程或者工程无法用sonar插件完成分析,那么可以使用Sonar Scanner来完成对接。下面将对两种对接方式进行详细介绍:
准备工作
向SonarQube管理员申请用户账号和对应的token,后续的登录SonarQube系统和执行代码扫描都会用到账号和token。
Maven sonar 插件
切换工作目录到工程的pom.xml文件所在目录,后续的Maven命令都是在该目录下执行。
首先进行工程的清理。
mvn clean
对项目进行编译。
mvn compile
对项目执行测试用例(测试用例例如UT,如果不存在测试用例,该步可以跳过)。
mvn test jacoco:report -Dmaven.test.failure.ignore=true
jacoco:report 表示在执行测试的过程中生成jacoco覆盖率报告,如果工程未集成jacoco,可以跳过。
-Dmaven.test.failure.ignore=true 表示在执行测试用例过程,忽略失败的用例,如果去掉这个参数,表示不忽略,那么当有测试用例失败时,该步将会执行失败。
对项目进行sonar扫描并上传报告。
mvn sonar:sonar -Dsonar.host.url={SonarQube服务地址} -Dsonar.login={token} -Dsonar.branch.name={当前分支}
-Dsonar.branch.name={当前分支} 这个参数不是必须的,如果不加这个参数,那么分支默认为master。
Sonar scanner
Sonar scanner适合于非Maven工程或者无法使用Maven sonar插件进行扫描的工程(例如无父工程存在的多模块工程),但是Sonar scanner需要配置很多配置项,使用起来会比Maven sonar插件的方式略微繁琐一些。
首先参考SonarScanner | SonarQube Docs进行Sonar scanner的安装。
执行“Maven sonar 插件”章节中的1到4步。
执行Sonar scanner来扫描代码并上传报告。
{Sonar scanner安装路径}/sonar-scanner -Dsonar.host.url={SonarQube服务地址} -Dsonar.login={token} -Dsonar.branch.name={当前分支} -Dsonar.projectKey={projectKey} -Dsonar.coverage.jacoco.xmlReportPaths={jacocoReportPaths} -Dsonar.java.binaries={javaBinaries} -Dsonar.java.test.binaries={javaTestBinaries} -Dsonar.java.libraries={javaLibraries} -Dsonar.java.test.libraries={javaTestLibraries} -Dsonar.tests={javaTests} -Dsonar.sources={javaSources}
-Dsonar.projectKey={projectKey} 表示当前工程的唯一标识。
-Dsonar.sources={javaSources} 表示源码的路径,多个目录可以用逗号分隔。
-Dsonar.java.binaries={javaBinaries} 表示源码编译后class文件所在的目录,多个目录可以用逗号分隔。
-Dsonar.java.libraries={javaLibraries} 表示工程依赖的jar包所在的目录,多个目录可以用逗号分隔。
-Dsonar.coverage.jacoco.xmlReportPaths={jacocoReportPaths} 表示jacoco xml报告所在文件路径,多个文件路径可以用逗号分隔,非必传,存在jacoco时传递该参数即可。
-Dsonar.tests={javaTests} 表示测试代码的路径,多个目录可以用逗号分隔,非必传,存在测试代码时传递该参数即可。
-Dsonar.java.test.binaries={javaTestBinaries} 表示测试代码编译后class文件所在的目录,多个目录可以用逗号分隔,非必传,存在测试代码时传递该参数即可。
-Dsonar.java.test.libraries={javaTestLibraries} 表示测试代码依赖的jar包所在的目录,多个目录可以用逗号分隔,非必传,存在测试代码时传递该参数即可。