
SonarQube常见问题和解决方法
1、本地开发工具配置快捷运行sonar命令的方法
idea配置方法:Run-->Edit Configurations-->新增Maven配置
Working directory:填写项目根目录
Command line:填写运行sonar的maven命令,填写如下内容
clean verify sonar:sonar -Dsonar.projectKey=hwpayment -Dsonar.host.url=http://192.168.80.50:3400 -Dsonar.login=sqp_c629f1e47f8b44b0a4307d63e922b2238b4b63ba
切记,不要mvn
2、某些目录或代码文件需要排除扫描,不进行sonar的代码静态扫描,不进行单元测试覆盖率统计,如何操作?
解决方法:在根目录的pom.xml,<profile>
标签下的<properties>
标签中增加<sonar.exclusions>
标签和内容,即可排除标签内目录或文件。
sample:Example.java结尾,dal/entity,dal/mapper,facade目录及其子目录下的java文件,不需要进行代码扫描和单元测试覆盖
注意:下面只是举例的排除sample写法,项目负责人可依据各自项目的需求,调整排除的代码范围。
<properties>
<!--sonar不扫描文件或目录-->
<sonar.exclusions>
**/*Example.java,
**/dal/entity/**,
**/dal/mapper/**,
**/facade/**
</sonar.exclusions>
</properties>
sonar排除配置的正则表达式说明:
? :匹配单个字符
** :匹配0个或多个文件夹
* :匹配0个或多个字符
3、本地运行后报错,错误提示“BizException{message='远程信息配置错误,无法初始化灰度activemq容器,zkPath:/HF/activemq/198.32.32.40_test/'}”
解决方法:在mvn运行命令后面加上-Dip_port=192.168.16.140,其中192.168.16.140是该应用在测试环境的AMQ地址,如:
mvn clean test -P sonar-test sonar:sonar -Dsonar.projectKey=projectName -Dsonar.host.url=http://sonar.test.com -Dsonar.login=test -Dsonar.password
4、为什么pom中没有添加sonar-maven-plugin插件,项目运行mvn sonar:sonar也能成功?
pom中显式声明sonar-maven-plugin插件的,会按照pom中指定的版本进行代码静态扫描;
pom中没有添加插件的,org.codehaus.mojo会自动下载sonar-maven-plugin,找到最新的版本3.7.0.1746,再自动下载最新的版本3.7.0.1746到本地,用最新的版本做代码静态扫描;
-
pom中显式声明:
<plugin> <groupId>org.sonarsource.scanner.maven</groupId> <artifactId>sonar-maven-plugin</artifactId> <version>3.7.0.1746</version> </plugin>
-
pom中没有添加插件的
原因:Sonar Maven插件在 Codehaus Mojo project托管,并受益于groupId“org.codehaus.mojo”,这允许使用快捷方式“sonar:sonar”而不是“org.codehaus.mojo:sonar-maven-plugin :: sonar”,所以pom中没有添加sonar-maven-plugin插件,有些项目也可以运行sonarscan成功。
地址:.m2\repository\org\codehaus\mojo\sonar-maven-plugin
maven-metadata-nexus.xml文件中,找到sonar最新版本
地址:.m2\repository\org\sonarsource\scanner\maven\sonar-maven-plugin\3.7.0.1746
自动下载最新版本到本地,用最新版本运行代码静态扫描
5、本地运行sonar的mvn命令后,报错“No plugin found for prefix '.host.url=http' in the current project and in the plugin groups [org.apache.maven.plugins, org.codehaus.mojo] available for the repositories”
原因:开发修改了默认的.m2的位置,在命令提示符下运行命令时,找不到修改后的本地仓库路径。
解决方法:在开发工具的Terminal窗口运行命令
6、运行sonar报错“The requested profile "sonar-test" could not be activated because it does not exist.”
完整的报错信息如下:
[16S][WARNING] The requested profile "sonar-test" could not be activated because it does not exist.
[16S][ERROR] The goal you specified requires a project to execute but there is no POM in this directory (/app/jenkins/ssd/workspace/qqrc-CI-CD-pipeline). Please verify you invoked Maven from the correct directory. -> [Help 1]
原因:项目代码根目录的pom文件中,没有添加sonar插件;
在代码中增加sonar插件;
操作:在分支的根目录下的pom.xml文件, <project>
标签中,增加<profiles>
标签内容;
注意:
1)如果pom中已经存在<profiles>
标签,请拷贝<profile>
子标签中的内容到<profiles>
标签;
2)拷贝内容放到根目录的pom文件中,不要放到其他模块下的pom文件中。
<profiles>
<profile>
<id>sonar-test</id>
<properties>
<!-- sonar -->
<sonar.language>java</sonar.language>
<sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
<sonar-maven-plugin.version>3.7.0.1746</sonar-maven-plugin.version>
<jacoco-maven-plugin.version>0.8.5</jacoco-maven-plugin.version>
<sonar.java.libraries>target/sonar</sonar.java.libraries>
<sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
<!--将所有jacoco定位到同样的父目录位置-->
<sonar.jacoco.reportPaths>${project.basedir}/../target/jacoco.exec</sonar.jacoco.reportPaths>
<!--sonar不扫描文件或目录-->
<sonar.exclusions>
**/*Example.java,
**/dal/entity/**,
**/dal/mapper/**,
**/facade/**
</sonar.exclusions>
</properties>
<build>
<plugins>
<!-- sonarqube -->
<plugin>
<groupId>org.sonarsource.scanner.maven</groupId>
<artifactId>sonar-maven-plugin</artifactId>
<version>${sonar-maven-plugin.version}</version>
</plugin>
<!-- jacoco -->
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>${jacoco-maven-plugin.version}</version>
<configuration>
<destFile>${sonar.jacoco.reportPaths}</destFile>
<!--用追加的模式-->
<append>true</append>
</configuration>
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
7、本地运行sonar命令后,报错“SCM provider autodetection failed. Both svn and git claim to support this project. Please use "sonar.scm.provider" to define SCM of your project”
解决方法:在本地运行的命令后面,增加参数-Dsonar.scm.provider=git 就可以解决该问题。
8、如果sonar扫描出来的问题是误判,或者经过研发团队负责人确认不需要进行修改,可按照如下方式操作
前置条件:使用账户登录sonar控台
操作:选中不需要修改的问题,点击批量修改按钮
在弹出的提示框中,选择"误判"或者"标记为不会修复",添加不修改的原因,再点击应用,该问题就不会再被错误报出,问题数量统计值就会动态减少。