使用Sonar踩过的坑

前要

服务商突然提出要增加代码质量管理,因此拉出sonarqube神器,虽然之前有用过,但是时间过久,导致搭建服务时还是踩了不少坑,这里就记录一下,也希望能对需要的朋友有所帮助。


服务搭建

我使用的是oracle数据库,服务器上同时搭建了两个版本的sonar服务,分别是6.0(5.6后不支持1.7)和5.4(支持jdk1.7),但是5.4版本在使用sonarlint插件(可本地扫描代码,同步qube规则)时不好用,所以就弃用了。
踩的第一个坑:一个oracle实例不能同时支持两个sonar服务,这是很坑的一点,导致我长时间没找到问题所在;
踩的第二个坑:sonar服务器个版本和idea的插件之间需要匹配,就像上面所说,一开始我用5.4版本的时候使用sonarlint2.7就提示无法同步服务,必须要5.6以上版本
踩的第三个坑:sonar和maven整合后,编译总是提示版本jdk不匹配,然后报一串url,如下

Caused by: java.lang.UnsupportedClassVersionError: org/sonarsource/scanner/maven/SonarQubeMojo : Unsupported major.minor version 52.0

[ERROR] realm =    plugin>org.codehaus.mojo:sonar-maven-plugin:3.0.1
[ERROR] strategy = org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy
[ERROR] urls[0] = file:/home/mavenlib/org/sonarsource/scanner/maven/sonar-maven-plugin/3.0.1/sonar-maven-plugin-3.0.1.jar
[ERROR] urls[1] = file:/home/mavenlib/org/apache/maven/shared/maven-dependency-tree/2.2/maven-dependency-tree-2.2.jar
[ERROR] urls[2] = file:/home/mavenlib/org/codehaus/plexus/plexus-component-annotations/1.5.5/plexus-component-annotations-1.5.5.jar
[ERROR] urls[3] = file:/home/mavenlib/org/eclipse/aether/aether-util/0.9.0.M2/aether-util-0.9.0.M2.jar
[ERROR] urls[4] = file:/home/mavenlib/org/sonatype/plexus/plexus-sec-dispatcher/1.4/plexus-sec-dispatcher-1.4.jar
[ERROR] urls[5] = file:/home/mavenlib/org/sonatype/plexus/plexus-cipher/1.4/plexus-cipher-1.4.jar

找了好久终于在一个不起眼的地方找到解决方法,在项目的pom文件中规定sonar-maven-plugin的版本以支持jdk1.7(此时我使用的是sonarqube5.4):


  org.codehaus.mojo
  sonar-maven-plugin
  2.6

由于我的项目pom中定义了sonar-maven-plugin是3.3.x,是不支持1.8以下的sonarqube版本了,如果你的sonarqube使用的是1.7,就需要下载sonar-maven-plugin2.6
如果你执意要使用6.0版本的sonarqube,那你就需要用jdk8.0来编译你的项目
还要说的一点就是,有的版本(好像是5.6.7以上)安装完成后需要运行IP:Port/setup更新下才可以正常运行


自定义sonar扫描规则时遇到的问题

网上一堆怎么写的教程或者原理,我就不多嘴了,要说的只是在搭建自定义规则开发环境的时候遇到的几个小问题。
我是直接下的默认最新版本ZIP包(下载地址:https://github.com/SonarSource/sonar-custom-rules-examples),下载下来后,一开始没注意工程结构直接导入IDE后发现无法使用,仔细看下才知道只需要导入我自己要用的java-custom-rules,重新按照maven项目导入进来后,就正常了。
项目导入后,我使用的默认jdk版本是1.7,导致maven打包过程中报UnsupportedClassVersionError,此时换一下jdk版本为8.0即可
jdk版本升级后打包又遇到

For artifact {null:null:null:jar}: The groupId cannot be empty

找了很久没找到问题,最后发现我定义的本地仓库地址是以前的老地址,可能用到了不完整的包,重新换一个地址,让maven自己下载所需的依赖包,就可以了
可以成功打包自己的sonar规则了,上传到服务器,重启,呕吼,又报错了,说是版本问题,用到了一个高版本的依赖,回到开发环境看一下POM,发现sonar.version和sonarjava.version版本定义过高,于是将之修改为符合我的sonarqube版本(我的是sonarqube6.0)的版本号,重新打包,上传,启动,完美运行!

6.0
4.0

Idea中用maven进行代码扫描

百度铺天盖地的说在maven中使用sonar,但是还需要配置maven环境变量,要弄很多其他东西,简便性不是很好,如果使用Idea的话其实可以在maven插件中定义一个命令,直接进行sonar发布

第一步:右击maven的clean命令,选择Create ****
使用Sonar踩过的坑_第1张图片
第二步:在clean后添加sonar:sonar 点击OK
使用Sonar踩过的坑_第2张图片
第三步:前两步完成后即可在刚才创建命令的地方看到RunConfigrations,其下有刚才创建的命令按钮,双击运行即可像mvn sonar:sonar一样运行,但是该方式不需要配jdk及maven的环境变量,比较方便快捷

自定义规则打包也可以用该方式

你可能感兴趣的:(java)