最近关注代码质量管理工具,用过了阿里的开发者规范插件后,又看了下 Sonar ,弄明白这个工具的使用流程花费了小半天的时间,这里整理下其中的盲点。说来也奇怪,搜索到的 IDEA 集成 Sonar 的文章也不少,就是没有一篇能教会我这个初次接触 Sonar 的人。还得靠自己连蒙带猜地各种尝试,才搞明白整个过程。
相关的模块及关系 Sonar :该工具的统称 SonarLint:IDEA 的 Sonar 插件 SonarQube:一个 Web 应用,服务端,统一管理 Sonar 扫描结果、扫描规则配置 sonar-maven-plugin:Sonar 客户端,从 SonarQube 服务器获取扫描规则,并上传扫描结果到 SonarQube 平台 插件安装插件的安装比较简单,这个基本上不会有问题,在插件仓库中搜索 “SonarLint” 插件,找到插件后点击安装即可。本机已经安装过了,结果如下:
可能是我本机使用的 IDEA 版本【2016.3.1】比较老,所以插件安装完成后,只有在某个文件编辑页面右键才有 “Analyze with SonarLint” 操作,而在工程上右键,网上都说菜单位于 Analyze 中:
我的 IDEA 中找不到这个操作,但是选中某个文件夹后,可以通过快捷键【Ctrl+Shif+S】对该目录进行扫描,通过进度条可以知道它扫描的是整个目录:
在单个文件中,右键有扫描操作:
注意点:插件安装成功后,可以直接进行扫描,虽然当前版本的 IDEA 工程右键没有这个操作,但是快捷键可以用,说明插件安装成功。
SonarQube 启动SonarQube 是 Sonar 的 Web 管理应用,非解压版的,下载地址 。
由于这是一个 Web 应用,需要用到数据库,需要创建一个数据库,名称没有限制,需要修改配置文件中的数据库连接信息。操作过程:
本地数据库用 MySQL ,创建一个名为 sonar 的数据库 解压 SonarQube ,定位到配置文件目录 E:\software\sonarqube-7.6\conf 修改 sonar.properties 文件,在 28 行添加如下配置:sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
sonar.jdbc.username=root
sonar.jdbc.password=123456
sonar.sorceEncoding=UTF-8
sonar.login=admin
sonar.password=admin
进入 bin 目录找到跟自己主机一致的目录 E:\software\sonarqube-7.6\bin\windows-x86-64
运行 StartSonar.bat 启动 SonarQube
注意点:StartSonar.bat 会启动一个 DOS 窗口运行,首次启动时耗时较长。此外,关闭 DOS 界面时,后台对应的 Java 进程不会结束。
不会结束的坑就是:端口会继续被占据。如果再次点击启动文件,则启动操作会闪退,此时可以在 log 目录中查看日志定位错误。因此,没有事情的话,不要关闭它的界面,如果必须关闭后重启,那么关闭后手动打开进程管理器,停掉对应的 Java 进程。
SonarQube 创建工程SonarQube 启动后,访问 http://localhost:9000 进入其登录界面,输入 sonar.properties 中配置的帐号和密码后进入主界面:
SonarQube 是以工程为单位进行扫描管理的,第一步需要点击 A 前面的 + 号,创建一个新工程:
注意点:如果插件配置认证方式为 Token ,那么这里需要记录该项目的 Token 信息。
IDEA 中需要配置 SonarQube 的访问地址和工程,配置方法为:
1.打开插件通用配置界面
2.点击 + 号添加 SonarServer
3.下一步配置认证信息
认证方式有两种,Token 和密码,Token 即前面创建项目时生成的 Token 信息。这里选择密码方式,输入 SonarQube 访问密码:
4.SonarLint 项目配置
至此,IDEA 插件 SonarLint 和 SonarQube 关联配置完成。
maven-sonar 插件,本质是一个 sonar-runner 扫描工具,也是一个客户端。根据 官方 maven-sonar 插件配置教程 完成 Maven setting.xml 配置。
1.添加 maven-sonar 插件
在 pluginGroups 节点下,添加一个子节点:
org.sonarsource.scanner.maven
2.添加 sonar 的 profile
在 profiles 节点下添加一个子节点,配置 sonar 插件的主机 URL:
sonar
true
http://localhost:9000
3.工程 pom.xml 配置插件版本
在待扫描工程的 pom.xml 文件中,添加 build 插件,配置 maven-sonar 插件版本:
org.sonarsource.scanner.maven
sonar-maven-plugin
3.6.0.1398
maven 执行扫描命令
直接运行 maven 生命周期中的各种方法,都不能完成 soanr 代码扫描及结果上传。官方是通过执行mvn sonar:sonar
命令完成的,所以想到的办法是在 IDEA 的 termianl 控制界面执行该命令,测试它的确能完成扫描结果的上传:
执行成功结果为:
maven-sonar 插件使用的注意点:不能对 SVN 服务器端版本较低的 SVN 项目进行扫描,否则会执行失败。
错误信息如下:
Error when executing blame for file src/main/java/com/xxxx/SpringContextUtil.java: svn: E200007: Retrieval of mergeinfo unsupported by svn:url
网上找的解决办法不生效,所以只能对本地非 SVN 项目进行代码扫描。
扫描结果查看mvn sonar:sonar
命令执行完成后,访问 SonarCube 主页能查看最新的扫描结果:
Issues 菜单下,选择 All 而不是 My Issues ,貌似它可以对扫描到的 Issues 进行分配,这里能看到所有的问题。
Project 菜单下,呈现各个项目的,这里使用命令执行后,自动创建了一个与工程应用名相同的项目:
反复执行扫描后,发现 SonarLint 插件的功能跟 maven-sonar 插件是一样的。理论上来讲,通过 SonarLint 功能,即对某个功能执行 Analyze with SonarLint 与在终端执行 mvn sonar:sonar
命令效果应该一样才对。
maven 的 setting.xml 中只配置了 SonarQube 的 host.url ,并没有指定项目名称,所以执行完成 mvn sonar:sonar
命令后,在 Web 页面会自动创建一个与扫描工程名称一样的项目。
而前面对插件配置的 SonarQube Server 和 project 指定是针对 Analyze with SonarLint 的,手动执行该操作后,理论上应该在对应的项目中看到扫描结果的。可惜,我这个 IDEA 版本下没有完成扫描结果的上传。