I am generating jacoco report by using jacoco:report tag. I am getting errors like :
[jacoco:report] Classes in bundle 'Code Coverage Report' do no match with execution data. For report generation the same class files must be used as at runtime. [jacoco:report] Execution data for class xxxxx does not match. [jacoco:report] Execution data for class yyyyy does not match.
The ant report target looks like :
<target name="report"> <jacoco:report> <executiondata> <file file="${jacocoexec.dir}/${jacocoexec.filename}"/> </executiondata> <!-- the class files and optional source files ... --> <structure name="Code Coverage Report"> <classfiles> <fileset file="./jar/abc.jar"/> </classfiles> <sourcefiles> <fileset dir="./code/src"/> </sourcefiles> </structure> <!-- to produce reports in different formats. --> <html destdir="${jacoco.report.dir}"/> </jacoco:report> </target>
The abc.jar
so generated is by using ./code/src
only. Then why is it giving such errors. Any idea?
Step 4: To get you code coverage report navigate to the target > site > jacoco > index.
Starting from JaCoCo 0.8. 2, we can exclude classes and methods by annotating them with a custom annotation with the following properties: The name of the annotation should include Generated.
The simplest way to use JaCoCo it is — on-the-fly instrumentation with using JaCoCo Java Agent. In this case a class in modified when it is being loaded. You can just run you application with JaCoCo agent and a code coverage is calculated. This way is used by Eclemma and Intellij Idea.
Run the mvn package command. The package command will invoke the test phase during the packaging of the project jar or war file. In the test phase, JaCoCo agent will initialize and run the code coverage analysis while the tests are executed.
You are getting the error related to classID. This is a concept described in detail at JaCoCo docs-site. http://www.eclemma.org/jacoco/trunk/doc/classids.html. This is a key step for supporting multiple versions of class (an appserver for example) in same JVM.
Copying part some part of it here for visibility.
What are class ids and how are they created?
Class ids are 64-bit integer values, for example 0x638e104737889183 in hex notation. Their calculation is considered an implementation detail of JaCoCo. Currently ids are created with a CRC64 checksum of the raw class file.
What can cause different class ids?
Class ids are identical for the exact same class file only (byte-by-byte). There is a couple of reasons why you might get different class files. First compiling Java source files will result in different class files if you use a different tool chain:
Different compiler vendor (e.g. Eclipse vs. Oracle JDK)
Different compiler versions
Different compiler settings (e.g. debug vs. non-debug)
Also post-processing class files (obfuscation, AspectJ, etc.) will typically change the class files. JaCoCo will work well if you simply use the same class files for runtime as well as for analysis. So the tool chain to create these class files does not matter.
Even if the class files on the file system are the same there is possible that classes seen by the JaCoCo runtime agent are different anyways. This typically happens when another Java agent is configured before the JaCoCo agent or special class loaders pre-process the class files. Typical candidates are:
The same page covers possible solutions.
What workarounds exist to deal with runtime-modified classes?
If classes get modified at runtime in your setup there are some workarounds to make JaCoCo work anyways:
Edited on 22-02-2017
How to use Offline Instrumentation: Use below task provided by Daniel Atallah.
//Additional SourceSets can be added to the jacocoOfflineSourceSets as needed by project.ext.jacocoOfflineSourceSets = [ 'main' ] task doJacocoOfflineInstrumentation(dependsOn: [ classes, project.configurations.jacocoAnt ]) { inputs.files classes.outputs.files File outputDir = new File(project.buildDir, 'instrumentedClasses') outputs.dir outputDir doFirst { project.delete(outputDir) ant.taskdef( resource: 'org/jacoco/ant/antlib.xml', classpath: project.configurations.jacocoAnt.asPath, uri: 'jacoco' ) def instrumented = false jacocoOfflineSourceSets.each { sourceSetName -> if (file(sourceSets[sourceSetName].output.classesDir).exists()) { def instrumentedClassedDir = "${outputDir}/${sourceSetName}" ant.'jacoco:instrument'(destdir: instrumentedClassedDir) { fileset(dir: sourceSets[sourceSetName].output.classesDir, includes: '**/*.class') } //Replace the classes dir in the test classpath with the instrumented one sourceSets.test.runtimeClasspath -= files(sourceSets[sourceSetName].output.classesDir) sourceSets.test.runtimeClasspath += files(instrumentedClassedDir) instrumented = true } } if (instrumented) { //Disable class verification based on https://github.com/jayway/powermock/issues/375 test.jvmArgs += '-noverify' } } } test.dependsOn doJacocoOfflineInstrumentation
Now generate report using "gradlew test jacocoTestReport"
command.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With