须知:这里使用sonarQube7.9版本(持续更新且稳定),数据库使用pg10版本
1. 简介
(1) sonar是什么
Sonar是一个用于代码质量管理的开源平台,用于管理代码的质量,通过插件形式可以支持二十几种语言的代码质量检测,通过多个维度的检查了快速定位代码中潜在的或者明显的错误。
(2) SonarQube与Sonar
SonarQube是sonar的服务端,相当于一个web服务器中的tomcat,用来发布应用,在线浏览分析等。
2.安装
官网下载后解压即可,下载后启动StartSonar.bat,去浏览器访问localhost:9000端口(默认9000端口,可改动)出现下图说明启动成功(sonarQube内置h2数据库,不配置数据库也可用于测试)
JDK使用11版本(如果出现远程主机强迫关闭了一个现有的连接。没配置数据库之前为端口占用问题,去配置文件里将端口号改成其他的即可,或者去命令行里查看9000端口被那个进程占用,结束他即可,
推荐更改端口号(sonar.properties文件中的sonar.web.port=要修改的端口号),
sonar.web.port=9090
配置数据库了是sonar连不上数据库或端口占用,测试数据库是否可以连接)
3.配置数据库
这里采用pg数据库10版本(sonarQube7.9及以上版本不支持mysql),若要使用mysql数据库则安装7.8版本且mysql为5.7版本(sonarQube不支持mysql5.7以下和8及以上版本)
去pg里新建sonar数据库,去sonarqube-7.9.5\conf修改
sonar.properties文件
sonar.jdbc.url=jdbc:postgresql://localhost:5432/postgres?currentSchema=public sonar.jdbc.username=mypostgres sonar.jdbc.password=mypostgres
sonar.web.port=9090
重启sonarQube等待一会,直到出现sonarQube is up字样
启动完毕后去sonarQube查看配置及数据库。
3. 代码分析
下载下载sonar-scanner,解压,配置环境变量,以为win10为例 选中path--编辑--新建--输入地址 C:\sonar-scanner-4.5.0.2216-windows\bin
环境变量配置了后确认无误,单还是提示不是内部或外部命令,去path里把sonar-canner环境变量往上提升到前三位置
输入sonar-scanner --version出现版本信息表示配置成功
4.1代码分析(单项目单模块)
去需要分析的项目根目录下新建sonar-project.properties文件,内容为
# must be unique in a given SonarQube instance
sonar.projectKey=my:project
# this is the name displayed in the SonarQube UI
sonar.projectName=springboot-ssm
sonar.projectVersion=1.0
# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
# Since SonarQube 4.2, this property is optional if sonar.modules is set.
# If not set, SonarQube starts looking for source code from the directory containing
# the sonar-project.properties file.
sonar.sources=src/main/java
sonar.java.binaries=./target/classes
# Encoding of the source code. Default is default system encoding
#sonar.sourceEncoding=UTF-8
字段意思:
Sonar.projectKey:项目的key,包住唯一即可,一般为项目名称
sonar.projectName:项目名称
sonar.projectVersion:版本号
sonar.sources:是源文件所在的目录
sonar.java.binaries:项目编译后的class文件的目录
文件配置好后,修改sonar-scanner.properties配置文件,配置扫描的结果同步到哪个数据库
sonar.jdbc.url=jdbc:postgresql://localhost:5432/postgres?currentSchema=public sonar.jdbc.username=mypostgres sonar.jdbc.password=mypostgres sonar.sourceEncoding=UTF-8 sonar.login=admin sonar.password=admin sonar.host.url=http://localhost:9090
都配置好后,win+R,cd命令跳转到根目录执行sonar-scanner命令,执行成功则出现如下界面:
访问9000端口的Issues(问题)查看分析结果
可在左侧的我的问题中选择代码存在的问题的种类
4.2单项目(多模块)
sonar-project.properties配置,简单版示例,
#项目id,唯一标识 sonar.projectKey=my:project #项目名 sonar.projectName=my_project #版本 sonar.projectVersion=1.0 #扫描源码,多模块,每个模块用逗号分割 ds-eop.sonar.sources=xxx/src/main/java, xxx-client/src/main/java, xxx-web/src/main/java, xxx-war/src/main/java #编译好的class文件存放位置 ds-eop-client.sonar.java.binaries=./xxx/target/classes ./xxx-client/target/classes, ./xxx-web/target/classes, ./xxx-war/target/classes
与单模块类似,只是在sources里的扫描文件变为多个,以逗号隔开,binaries也类似。
- 扫描web项目
先到配置-应用市场-插件里下载web插件
然后新建项目
去根目录下执行此命令
补充:
sonar-scanner的配置也可以进行分模块配置,比如我想检测一个web项目的所有文件(包括Java、JSP、JS、Html、XML),如下:
如果检测html和JSP需要下载sonar-html-plugin-3.1.0.1615.jar插件置于extensions\plugins目录下,而且html的language为web,jsp的language为jsp
# must be unique in a given SonarQube instance
sonar.projectKey=my:project
# this is the name displayed in the SonarQube UI
sonar.projectName=sonarTest
sonar.projectVersion=1.0
sonar.modules=java-module,javascript-module,xml-module,jsp-module,html-module
sonar.sourceEncoding=UTF-8
# Java module
java-module.sonar.projectName=Java Module
java-module.sonar.language=java
java-module.sonar.projectBaseDir=.
java-module.sonar.sources=src
#ignore files and directory
java-module.sonar.exclusions=src/cn/qlq/test2/**,src/cn/qlq/test3.java
sonar.java.binaries=./build
# JavaScript module
javascript-module.sonar.projectName=JavaScript Module
javascript-module.sonar.projectBaseDir=.
javascript-module.sonar.language=js
javascript-module.sonar.sources=WebContent
# Jsp module
jsp-module.sonar.projectName=Jsp Module
jsp-module.sonar.projectBaseDir=.
jsp-module.sonar.language=jsp
jsp-module.sonar.sources=WebContent
# Html module
html-module.sonar.projectName=Html Module
html-module.sonar.projectBaseDir=.
html-module.sonar.language=web
html-module.sonar.sources=WebContent
#Xml module
xml-module.sonar.projectName=Xml Module
xml-module.sonar.projectBaseDir=.
xml-module.sonar.language=xml
xml-module.sonar.sources=WebContent
#项目id,唯一标识 sonar.projectKey=my:project #项目名 sonar.projectName=my_project #版本 sonar.projectVersion=1.0 sonar.sourceEncoding=UTF-8 #包含模块 sonar.modules=xxx,xxx-client,xxx-war,xxx-web xxx.sonar.projectName=xxx xxx.sonar.modules=java-module,xml-module # Java module xxx.java-module.sonar.projectName=xxx-java-module xxx.java-module.sonar.sources=src/main/java,src/test/java xxx.java-module.sonar.java.binaries=./target/classes xxx.java-module.sonar.language=java xxx.java-module.sonar.projectBaseDir=. #Xml module xxx.xml-module.sonar.projectName=xxx-xml-module xxx.xml-module.sonar.projectBaseDir=. xxx.xml-module.sonar.language=xml xxx.xml-module.sonar.sources=src/main/resources,src/test/resources #################################################################################################### xxx-client.sonar.projectName=xxx-client xxx-client.sonar.modules=java-module,xml-module xxx-client.java-module.sonar.projectName=xxx-client-java-module xxx-client.java-module.sonar.sources=src/main/java,src/test/java xxx-client.java-module.sonar.java.binaries=./target/classes xxx-client.java-module.sonar.language=java xxx-client.java-module.sonar.projectBaseDir=. xxx-client.xml-module.sonar.projectName=xxx-client-xml-module xxx-client.xml-module.sonar.projectBaseDir=. xxx-client.xml-module.sonar.language=xml xxx-client.xml-module.sonar.sources=src/main/resources,src/test/resources #################################################################################################### xxx-web.sonar.projectName=xxx-web xxx-web.sonar.modules=java-module,xml-module xxx-web.java-module.sonar.projectName=xxx-web-java-module xxx-web.java-module.sonar.sources=src/main/java,src/test/java xxx-web.java-module.sonar.java.binaries=./target/classes xxx-web.java-module.sonar.language=java xxx-web.java-module.sonar.projectBaseDir=. xxx-web.xml-module.sonar.projectName=xxx-web-xml-module xxx-web.xml-module.sonar.projectBaseDir=. xxx-web.xml-module.sonar.language=xml xxx-web.xml-module.sonar.sources=src/main/resources,src/test/resources #################################################################################################### xxx-war.sonar.projectName=xxx-war xxx-war.sonar.modules=java-module,xml-module,html-javascript-module xxx-war.java-module.sonar.projectName=xxx-war-java-module xxx-war.java-module.sonar.sources=src/main/java,src/test/java xxx-war.java-module.sonar.java.binaries=./target/classes xxx-war.java-module.sonar.language=java xxx-war.java-module.sonar.projectBaseDir=. xxx-war.xml-module.sonar.projectName=xxx-war-xml-module xxx-war.xml-module.sonar.projectBaseDir=. xxx-war.xml-module.sonar.language=xml xxx-war.xml-module.sonar.sources=src/main/resources,src/test/resources # html-javascript-module xxx-war.html-javascript-module.sonar.projectName=xxx-war-javaScript-module xxx-war.html-javascript-module.sonar.projectBaseDir=. xxx-war.html-javascript-module.sonar.language=web,js xxx-war.html-javascript-module.sonar.sources=src/main/webapp # javascript-html-module xxx-war.javascript-html-module.sonar.projectName=xxx-war-javaScript-module xxx-war.javascript-html-module.sonar.projectBaseDir=. xxx-war.javascript-html-module.sonar.language=js,web xxx-war.javascript-html-module.sonar.sources=src/main/webapp
汉化:到https://docs.sonarqube.org/display/PLUG/Plugin+Library 网站搜索 chinese pack 找到自己的版本对应的jar包版本
然后点击到对应的git地址https://github.com/SonarQubeCommunity/sonar-l10n-zh/releases下载对应版本的jar包,下载之后放到extensions\plugins目录下面重启即可,
5. 注册为windows服务
去conf目录下打开wrapper.conf文件,将wrapper.java.command的java改问jdk中java.exe的绝对路径
sonar自带的有注册与删除服务的方法,采用wrapper注册为服务,如下已管理员方式运行InstallNTService.bat即
集成阿里p3c规则:
1.下载插件
p3c的jar包为3.2版本,版本不对可能启动不了sonar-pmd-plugin-3.2.0-SNAPSHOT.jar
2.jar放在sonarqube-7.9.5\extensions\plugins目录下
3.重启sonarqube
4.去质量配置,右上角,创建,名字自定义,语言java
5.到网页规则搜索p3c,如下
- 接下来激活p3c规则 (选择上面的创建的p3c,同时搜索未激活的p3c,然后激活即可。如果p3c也需要即可sonar的自带规则就不要加搜索条件,选择所有的规则)
- 查看p3c激活的规则
- 到质量配置设为java默认规则即可