Problem
Download the sample project from
..here
maven-antrun-plugin solution
The case is ..
- a multi-module project managed by maven
- some project has test cases (junit) of others ..project A has the junits and project B,C have the business
- you are using sonar and cobertura to get code coverage percentage
- Now, you get 0 coverage in project B, C and wrong indicator in project A
- you want to use maven as usual and don't use ant :)
Download the sample project from
..here
maven-antrun-plugin solution
- Download http://sourceforge.net/projects/cobertura/files/cobertura/1.9.4.1/cobertura-1.9.4.1-bin.zip/download and extract to local folder, later we will refer to the lib folder inside the distribution by cobertura.lib.dir
- add this profile to the parent project. with cobertura dependency to do the cleanup
<dependencies>
<dependency>
<groupid>net.sourceforge.cobertura</groupid>
<artifactid>cobertura</artifactid>
<version>1.9.4.1</version>
</dependency>
</dependencies>
<profiles>
<profile>
<id>code-coverage</id>
<build>
<plugins>
<plugin>
<groupid>org.apache.maven.plugins</groupid>
<artifactid>maven-clean-plugin</artifactid>
<version>2.4.1</version>
<configuration>
<filesets>
<fileset>
<directory>.</directory>
<includes>
<include>*.ser</include>
</includes>
</fileset>
</filesets>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
- add this profile to each module ... to do instrumentation except the ear and the parent
<profiles>
<profile>
<id>code-coverage</id>
<build>
<plugins>
<plugin>
<artifactid>maven-antrun-plugin</artifactid>
<version>1.7</version>
<dependencies>
<dependency>
<groupid>net.sourceforge.cobertura</groupid>
<artifactid>cobertura</artifactid>
<version>1.9.4.1</version>
</dependency>
</dependencies>
<executions>
<execution>
<phase>compile</phase>
<configuration>
<target>
<taskdef classname="net.sourceforge.cobertura.ant.InstrumentTask" name="cobertura-instrument">
<classpath path="${cobertura.lib.dir}/cobertura.jar;${cobertura.lib.dir}/log4j.jar;${cobertura.lib.dir}/asm.jar;${cobertura.lib.dir}/asm-tree.jar;${cobertura.lib.dir}/jakarta-oro.jar">
</classpath></taskdef>
<cobertura-instrument todir="./target/classes">
<fileset dir="./target/classes">
<include name="**/*.class">
</include></fileset>
</cobertura-instrument>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
- add this profile to the ear project .. to do the merge and generate the report (note the location of source and test code)
<profiles>
<profile>
<id>code-coverage</id>
<build>
<plugins>
<plugin>
<artifactid>maven-antrun-plugin</artifactid>
<version>1.7</version>
<dependencies>
<dependency>
<groupid>net.sourceforge.cobertura</groupid>
<artifactid>cobertura</artifactid>
<version>1.9.4.1</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>test</id>
<phase>test</phase>
<configuration>
<target>
<taskdef classname="net.sourceforge.cobertura.ant.MergeTask" name="cobertura-merge">
<classpath path="${cobertura.lib.dir}/cobertura.jar;${cobertura.lib.dir}/log4j.jar;${cobertura.lib.dir}/asm.jar;${cobertura.lib.dir}/asm-tree.jar;${cobertura.lib.dir}/jakarta-oro.jar">
</classpath></taskdef>
<taskdef classname="net.sourceforge.cobertura.ant.ReportTask" name="cobertura-report">
<classpath path="${cobertura.lib.dir}/cobertura.jar;${cobertura.lib.dir}/log4j.jar;${cobertura.lib.dir}/asm.jar;${cobertura.lib.dir}/asm-tree.jar;${cobertura.lib.dir}/jakarta-oro.jar">
</classpath></taskdef>
<mkdir dir="target/sum">
<mkdir dir="target/report">
<cobertura-merge datafile="target/sum/coberturaSum.ser">
<fileset dir="../.">
<include name="**/cobertura.ser">
</include></fileset>
</cobertura-merge>
<cobertura-report datafile="target/sum/coberturaSum.ser" destdir="target/report" format="xml">
<fileset dir="../bus1/src/main/java">
<fileset dir="../bus1/src/test/java">
<fileset dir="../bus2/src/main/java">
<fileset dir="../bus2/src/test/java">
<fileset dir="../test/src/main/java">
<fileset dir="../test/src/test/java">
</fileset></fileset></fileset></fileset></fileset></fileset></cobertura-report>
</mkdir></mkdir></target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
- Then execute with the following
clean
install org.codehaus.sonar:sonar-maven3-plugin:3.0:sonar -P
code-coverage -Dmaven.test.failure.ignore=true
-Dsonar.dynamicAnalysis=reuseReports
-Dsonar.cobertura.reportPath=../busEar/target/report/coverage.xml
-Dcobertura.lib.dir=../parent/cobertura-jars