一)sonar是什么
Sonar 是一个开源的质量管理平台,专注于从项目组合到类方法的持续的分析和测量技术质量,它把代码质量相关软件集成到一起统一管理。可以使用开源的插件来扩展Sonar,查看扩展可以访问 open source plugins forge。以下是sonar环境及相关技术的一个关联图:
二)安装与使用
windows下安装
1)从官方网站(http://www.sonarsource.org)下载安装包,并解压;
2)创建数据库,Sonar默认使用嵌入式Derby数据库,为使用MySQL需首先创建一个sonar/sonar的UTF-8的mysql数据库, 并授权访问sonar库。数据库代码如下:
CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci;
grant all privileges on sonar.* to 'sonar'@'%' identified by 'sonar';
flush privileges;
3) 修改sonar配置文件conf\sonar.properties中连接数据库方式,将原来的连接方式注释掉,启用以下代码;
sonar.jdbc.url: jdbc:mysql://IP:3306/sonar?useUnicode=true&characterEncoding=utf8
sonar.jdbc.driver: com.mysql.jdbc.Driver
sonar.jdbc.validationQuery: select 1
4) 在bin\windows-x86-32目录下找到对应的批处理文件StartSonar.bat,启动sonar,登陆http://localhost:9000;查看是否成功。
Linux下安装
1)$ wget http://dist.sonar.codehaus.org/sonar-3.4.1.zip
$ unzip sonar-3.4.1.zip
2)和3)同上
4) $ ./sonar-3.4.1/bin/linux-x86-64/sonar.sh start,启动sonar,登陆http://ip:9000;查看是否成功。
三)分析工程
1) 从 这里 下载 sonar-ant-task-2.0.jar ,将其放置在被分析 Java 工程的 lib 目录下;
2) 在build.xml文件中加入以下代码:
<project name="***" default="sonar" basedir="." xmlns:sonar="antlib:org.sonar.ant">
<!-- ========= 工程属性定义 ========= -->
<property name="project.name" value="***"/>
<property name="sonar.src.dir" value="${basedir}/src" />
<property name="sonar.lib.dir" value="WebRoot/WEB-INF/lib"/>
<!--Sonar属性定义 -->
<property name="sonar.projectKey" value="org.example:${project.name}" />
<property name="sonar.projectName" value="${project.name}" />
<property name="sonar.projectVersion" value="1.0" />
<property name="sonar.language" value="java" />
<property name="sonar.sources" value="${sonar.src.dir}" />
<property name="sonar.tests" value="${sonar.test.dir}" />
<property name="sonar.host.url" value="http://localhost:9000" />
<property name="sonar.jdbc.url"
value="jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8"/>
<property name="sonar.jdbc.driverClassName" value="com.mysql.jdbc.Driver" />
<property name="sonar.jdbc.username" value="sonar" />
<property name="sonar.jdbc.password" value="sonar" />
<!-- ========= Sonar分析客户端 ========= -->
<target name="sonar" depends="sonar.compile">
<taskdef uri="antlib:org.sonar.ant" resource="org/sonar/ant/antlib.xml">
<classpath path="${sonar.lib.dir}/sonar-ant-task-2.0.jar" />
</taskdef>
<!-- 执行 Sonar -->
<sonar:sonar key="${sonar.projectKey}" version="1.0"xmlns:sonar="antlib:org.sonar.ant"/>
</target>3) 直接运行ant build或者在命令行输入ant sonar就可以分析Java工程,结束后上传数据至指定sonar网站。
四)加入单元测试统计
<!-- JaCoCo相关配置: -->
<property name="sonar.dynamicAnalysis" value="reuseReports" />
<property name="sonar.java.coveragePlugin" value="jacoco" />
<property name="sonar.jacoco.reportPath" value="target/jacoco.exec" />
<!-- testng定义: -->
<taskdef name="testng"classname="com.beust.testng.TestNGAntTask">
<classpath>
<path refid="sonar.classpath"/>
</classpath>
</taskdef>
<!-- 引入 JaCoCo Ant Task -->
<taskdef uri="antlib:org.jacoco.ant"resource="org/jacoco/ant/antlib.xml">
<classpath path="${sonar.lib.dir}/jacocoant.jar" />
</taskdef>
<!-- 运行单元测试, 添加 JaCoCo agent -->
<jacoco:coverage destfile="target/jacoco.exec"xmlns:jacoco="antlib:org.jacoco.ant">
<testng outputDir="${testng.report.dir}"classpathref="sonar.runpath" excludedgroups="${EX}">
<xmlfileset dir="${test.resources.dir}"includes="testng.xml"/>
<jvmarg value="-Dtest.resources.dir=${test.resources.dir}" />
</testng>
</jacoco:coverage>
</target>
<!-- ========= Sonar分析客户端 ========= -->
<target name="sonar" depends="sonar.compile">
<taskdef uri="antlib:org.sonar.ant"resource="org/sonar/ant/antlib.xml">
<classpath path="${sonar.lib.dir}/sonar-ant-task-2.0.jar"/>
</taskdef>
<!-- 执行 Sonar -->
<sonar:sonar key="${sonar.projectKey}" version="1.0"xmlns:sonar="antlib:org.sonar.ant"/>
</target>