ant+sonar+jacoco代码质量代码覆盖率扫描

使用ant构建的java web项目如何做sonar代码质量扫描?
以下就是实际遇到并成功使用的案例
一、做sonar扫描的准备工作
    1.给web项目增加build.xml构建脚本。
    2.下载jar包:jacocoant.jar;sonar-ant-task-2.2.jar
    3.搭建一个sonar服务器
二、在build.xml中编写jacoco和sonar的脚本

  案例的build.xml脚本

<?xml version="1.0" encoding="UTF-8"?>
<project name="Simple Java Project analyzed with the Sonar Ant Task" default="all" basedir="." xmlns:jacoco="antlib:org.jacoco.ant" xmlns:sonar="antlib:org.sonar.ant">

        <!-- ========= Define the main properties of this project ========= -->
        <property name="src.dir" value="src" />
        <property name="build.dir" value="target" />
        <property name="classes.dir" value="${build.dir}/classes" />
        <property name="webRoot.dir" value="${basedir}/WebRoot"/>
        <property name="lib.dir" value="${webRoot.dir}/WEB-INF/lib"/>
        <property name="reports.junit.xml.dir" value="${basedir}/target/junit"/>

        <path id="project.classpath">
            <fileset dir="${lib.dir}">
                <include name="*.jar"/>
            </fileset>
            <!--<fileset dir="${basedir}/lib">
                       <include name="*.jar" />
            </fileset>  -->
            <pathelement path="${basedir}/WebRoot/WEB-INF/lib"/>
        </path>

        <property name="sonar.host.url" value="http://172.31.65.167:9000/" />

        <!-- Define the Sonar properties -->
        <property name="sonar.projectKey" value="com.ceair.ma:ma" />
        <property name="sonar.projectName" value="ma" />
        <property name="sonar.projectVersion" value="1.0" />
        <property name="sonar.language" value="java" />
        <property name="sonar.sources" value="src" />
        <property name="sonar.binaries" value="target/classes" />

        <property name="sonar.working.directory" value="target/sonar" />
        <!--property name="sonar.surefire.reportsPath" value="sonar/build/surefire-reports/findbugs-result.xml" /-->
        <property name="sonar.sourceEncoding" value="UTF-8" />

        <!-- sonar使用jacoco配置: -->
        <property name="sonar.dynamicAnalysis" value="reuseReports" />
        <property name="sonar.java.coveragePlugin" value="jacoco" />
        <property name="sonar.jacoco.reportPath" value="jacoco.exec" />

        <!-- Add your basic Sonar configuration below: sonar.jdbc.url, sonar.jdbc.username, etc. properties -->
        <property name="sonar.jdbc.url" value="jdbc:mysql://172.31.65.167:3306/test?useUnicode=true&amp;characterEncoding=utf8" />
        <property name="sonar.jdbc.username" value="test" />
        <property name="sonar.jdbc.password" value="000000" />
        <property name="sonar.junit.reportsPath" value="target/sonar" />

        <!-- 控制台打印sonar分析的详细信息-->
        <!--<property name="sonar.verbose" value="true" /> -->

        <!-- ========= Define "regular" targets: clean, compile, ... ========= -->
        <target name="clean">
                <delete dir="${build.dir}" />
        </target>
        <target name="init">
            <mkdir dir="${build.dir}" />
            <mkdir dir="${classes.dir}" />
            <mkdir dir="${reports.junit.xml.dir}" />
        </target>

        <target name="compile" depends="init">
            <javac srcdir="${src.dir}" destdir="${classes.dir}" source="1.6" target="1.6" debug="on"
               deprecation="false" optimize="false" failonerror="true" >
                <compilerarg line="-encoding UTF-8"/>
                <classpath refid="project.classpath"></classpath>
            </javac>
        </target>

        <target name="test" depends="compile">

            <taskdef name="junit" classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTask">
                <classpath>
                    <path refid="project.classpath"/>
                </classpath>
            </taskdef>

            <!-- Import the JaCoCo Ant Task -->
            <taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
                <!-- Update the following line, or put the "jacocoant.jar" file in your "$HOME/.ant/lib" folder -->
                <classpath path="${basedir}/third/jacocoant.jar" />
            </taskdef>

            <!-- Run your unit tests, adding the JaCoCo agent -->
            <jacoco:coverage>
             <junit fork="true" forkmode="once" printsummary="on" showoutput="true">
                 <!--<classpath location="${classes.dir}" />
                <classpath refid="project.classpath" />-->

                <formatter type="xml" usefile="true"/>
                 <classpath>
                  <fileset dir="${lib.dir}" includes="**/*.jar"/>
                  <pathelement path="${classes.dir}"/>
                </classpath>
                <batchtest todir="${reports.junit.xml.dir}">
                 <fileset dir="${classes.dir}">
                    <include name="**/*Test*.*" />
                 </fileset>
                </batchtest>
             </junit>
            </jacoco:coverage>    

            <!--<jacoco:report>
                <executiondata>
                    <file file="jacoco.exec" />
                </executiondata>
                <structure name="ma project coverage report">
                    <classfiles>
                        <fileset dir="${basedir}/target/classes" />
                    </classfiles>
                    <sourcefiles encoding="UTF-8">
                        <fileset dir="${src.dir}" />
                    </sourcefiles>
                </structure>
                <html destdir="${basedir}/target/report" />
                <csv destfile="${basedir}/target/report/report.csv" />
                <xml destfile="${basedir}/target/report/report.xml" />
            </jacoco:report> -->

        </target>

        <!-- ========= Define Sonar target ========= -->
        <target name="sonar" depends="compile">
                <taskdef uri="antlib:org.sonar.ant" resource="org/sonar/ant/antlib.xml">
                        <!-- Update the following line, or put the "sonar-ant-task-*.jar" file in your "$HOME/.ant/lib" folder -->
                        <classpath path="${basedir}/third/sonar-ant-task-2.2.jar" />
                </taskdef>

                <!-- Execute Sonar -->
                <sonar:sonar />
        </target>

        <!-- ========= The main target "all" ========= -->
        <target name="all" depends="clean,compile,test,sonar" />

</project>

build.xml

1.因为ant中没有像maven那样天然集成sonar,所以在脚本中需要加入很多sonar需要的属性。
    2.需要一个target任务执行jacoco:coverage并生成代码覆盖率文件jacoco.exec;这里注意jacoco.exec是在<jacoco:coverage destfile="${basedir}/jacoco.exec">指定,如果没有destfile属性则默认在项目根目录生成名为jacoco.exec文件。这个生成的文件要和<property name="sonar.jacoco.reportPath" value="jacoco.exec" />对应,这步是把jacoco.exec交给sonar去解析。

        <jacoco:coverage>
             <junit fork="true" forkmode="once" printsummary="on" showoutput="true">
                <formatter type="xml" usefile="true"/>
                 <classpath>
                  <fileset dir="${lib.dir}" includes="**/*.jar"/>
                  <pathelement path="${classes.dir}"/>
                </classpath>
                <batchtest todir="${reports.junit.xml.dir}">
                 <fileset dir="${classes.dir}">
                    <include name="**/*Test*.*" />
                 </fileset>
                </batchtest>
             </junit>
        </jacoco:coverage>    

  3.这步非必须;如果要生成jacoco报表还可以添加一个<jacoco:report>,可以生成html、xml、csv类型的报表。

            <jacoco:report>
                <executiondata>
                    <file file="jacoco.exec" />
                </executiondata>
                <structure name="ma project coverage report">
                    <classfiles>
                        <fileset dir="${basedir}/target/classes" />
                    </classfiles>
                    <sourcefiles encoding="UTF-8">
                        <fileset dir="${src.dir}" />
                    </sourcefiles>
                </structure>
                <html destdir="${basedir}/target/report" />
                <csv destfile="${basedir}/target/report/report.csv" />
                <xml destfile="${basedir}/target/report/report.xml" />
            </jacoco:report>        

  4、代码覆盖率做完了就可以做sonar代码质量扫描了。

        <target name="sonar" depends="compile">
            <taskdef uri="antlib:org.sonar.ant" resource="org/sonar/ant/antlib.xml">
                    <classpath path="${basedir}/third/sonar-ant-task-2.2.jar" />
            </taskdef>

            <!-- 执行 Sonar -->
            <sonar:sonar />
    </target>

三、运行这个build脚本,成功后就可以去sonar服务器查看结果了。

具体参见 http://blog.chinaunix.net/uid-1835840-id-3616622.html

时间: 2024-10-09 20:04:46

ant+sonar+jacoco代码质量代码覆盖率扫描的相关文章

sonar的安装与代码质量检测实例

说明:sonar依赖数据库. mysql优化 1.笔者使用的是mysql数据库.首先对mysql做简单的优化配置. [[email protected] bin]# cat /etc/my.cnf [mysqld] max_allowed_packet=10M datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock user=mysql # Disabling symbolic-links is recommended to prevent

Java代码质量监控工具Sonar安装

1.  代码质量七宗罪 Sonar是一个代码质量管理系统,它的帮助文档开篇明义,提出了代码质量的七宗罪,总结的比较到位,不妨一看: 1.        Bug和隐藏Bug(Bugs and Potential Bugs) 2.        违反编码规范(Coding Standards Breach) 3.        复制粘贴(Duplications) 4.        缺乏单元测试(Lack of Unit Tests) 5.        恶劣的复杂度分布(Bad Distribu

【代码质量】C++代码质量扫描主流工具深度比较

本文由腾讯WeTest团队提供,未经授权严禁转载!更多资讯可直接戳链接查看:http://wetest.qq.com/lab/ 微信号:TencentWeTest 文/张蓓 引言 静态代码分析是指无需运行被测代码,通过词法分析.语法分析.控制流.数据流分析等技术对程序代码进行扫描,找出代码隐藏的错误和缺陷,如参数不匹配,有歧义的嵌套语句,错误的递归,非法计算,可能出现的空指针引用等等.统计证明,在整个软件开发生命周期中,30% 至 70% 的代码逻辑设计和编码缺陷是可以通过静态代码分析来发现和修

基于docker搭建sonar代码质量检测平台

最近有点忙,好久不写博文了,今天听一个同事说之前他们的代码review都是人工来弄的,这多累,于是我赶紧搭建一个sonar代码质量检测平台给大家用用 docker环境搭建什么的就不说了.网上很多,直接上核心命令 第一条是docker 运行一个pgsql 第二条是docker 运行一个sonar docker run -d --name pgdb -e POSTGRES_USER=sonar -e POSTGRES_PASSWORD=sonar -v /data/pgdata:/var/lib/p

IDEA中关闭sonar代码质量检测

笔者在IDEA中禁用了SonarLint等各种配置,还是无效,后来在网上找到说是插件的bug, There was a bug in SonarLint for IntelliJ that prevented the configuration to be properly saved. It was fixed in the latest version 2.3.2: https://jira.sonarsource.com/browse/SLI-106 About the performan

用Sonarqube检查和度量代码质量——安装sonarqube

以前关注点一直在怎么提高应用程序的质量,没太在意代码级别的质量.最近因为某些因素的推动,需要关注到代码级别的质量去,把质量工作尽量往前推,也符合质量控制的原则.  试用了一下sonarqube(老版本的叫sonar,ww.sonarqube.org),对代码的提升的确有很多的作用,sonarqube能从7个维度来对代码质量进行度量.多大的作用,大家实践下就很容易看出来.尤其是建议大家把rules里面的说明和例子都好好看看,对以后自己写代码的时候,质量提高有很大好处. Sonarqube安装:  

用 Eclipse 插件提高代码质量

如果能在构建代码前发现代码中潜在的问题会怎么样呢?很有趣的是,Eclipse 插件中就有这样的工具,比如 JDepend 和 CheckStyle,它们能帮您在软件问题暴露前发现这些问题.在 让开发自动化 的本期文章中,自动化专家 Paul Duvall 将带来一些关于 Eclipse 插件的例子,您可以安装.配置和使用这些静态分析插件,以便在开发生命周期的早期预防问题. 关于本系列 作为一名开发人员,我们的工作就是为终端用户将过程自动化:然而,我们当中有很多人却忽视了将我们自己的开发过程自动化

通过JaCoCo统计接口测试代码覆盖率

通过JaCoCo统计接口测试代码覆盖率 JaCoCo 需求:统计微服务接口测试的代码覆盖率 JaCoCo的ant与maven方法都是在编译期对单元测试的覆盖率统计 JaCoCo的可以开启一个agent服务收集运行过程中的代码执行覆盖率. 主要会用到jacoco 的两个功能:agent和cli 覆盖率收集 1. 收集方式 2. JaCoCo使用 Sprint Boot测试项目 1. 创建项目 2. 工程结构 3. CountController.java 4. 上传代码到github 覆盖率统计测

使用 Sonar 进行代码质量管理及邮件报警

一.Sonar 概述 Sonar 是一个用于代码质量管理的开放平台.通过插件机制,Sonar 可以集成不同的测试工具,代码分析性工具,以及持续集成工具. 与持续集成工具(例如 Hudson/Jenkins 等)不同,Sonar 并不是简单地把不同的代码检查工具结果(例如 FindBugs,PMD 等)直接显示在 Web 页面上,而是通过不同的插件对这些结果进行再加工处理,通过量化的方式度量代码质量的变化,从而可以方便地对不同规模和种类的工程进行代码质量管理. 在对其他工具的支持方面,Sonar