Wenn ich ein Java-Projekt habe, das eine Bibliothek (eine JAR-Datei) verwendet, ist es möglich, die Codeabdeckung von Klassen in diesem Jar zu erhalten?Wie bekomme ich Codeabdeckung einer externen Java-Bibliothek mit Jacoco?
Die Idee dahinter ist, dass ich herausfinden möchte, welchen Anteil der externen Bibliotheken das Projekt benötigt (sagen wir Frühling, Winterschlaf oder die Scala-Gläser, wenn es ein Scala-Projekt war, warum nicht). werden tatsächlich verwendet. Ich stelle mir sogar vor, dass ich versuchen könnte, sie aufzulisten und sie in einem einzigen Gefäß neu zu bündeln, das nur notwendige .class-Dateien (mit einem Plugin wie Apache Felix, zum Beispiel) enthalten würde, um das kleinstmögliche Glas zu bekommen. Ich bin mir nicht sicher, ob ich das wirklich tun möchte, ich weiß, dass es aus verschiedenen Gründen eine schlechte Idee ist, aber ich denke, es ist ein Experiment.
Ich kann nicht finden, wie es geht, jacoco berichtet nur Abdeckung für die Klassendateien direkt innerhalb meines Projektes. Ich bin etwas falsch zu machen, ich bin mit dem Maven Plugin wie dies vielleicht:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.5.6.2012</version>
<configuration>
<destfile>${basedir}/target/coverage-reports/jacoco-unit.exec</destfile>
<datafile>${basedir}/target/coverage-reports/jacoco-unit.exec</datafile>
<includes>
<include>**</include>
</includes>
</configuration>
<executions>
<execution>
<id>jacoco-initialize</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>jacoco-site</id>
<phase>package</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
Ich habe versucht, den Tag ist zu ändern, aber der einzige Effekt ist die Einschränkung den Standard, die direkt nur die Klassendateien enthalten im Innern Mein Projekt.
Vielen Dank im Voraus!
bearbeiten nach Oers' Antwort:
ich herausgefunden habe, wie es mit Ant und antrun-Plugin zu tun, obwohl es sehr kompliziert ist, ich viel Mühe mit antrun Plugin-Versionen (nicht in der Lage zu machen, hatte ein letzte Version, selbst für eine grundlegende Aufgabe) und ich würde gerne bei Maven bleiben. Wenn jemand weiß, wie man mit je jacoco maven plugin statt mit ant macht, bin ich interessiert!
Teillösung mit ant: tatsächlich enthielt die Datei jacoco.exec bereits Verweise auf die Klassen meiner externen Jars; Daher ist es die Aufgabe des Berichts, die diese Jar berücksichtigen sollte, und nicht die Laufzeitphase, wie ich dachte. Hier ist die Maven-Konfiguration, die ich verwendet (ich fand Hilfe bei http://intellectualcramps.wordpress.com/2012/03/22/jacoco-tycho-and-coverage-reports/):
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<!--<version>1.7</version>-->
<dependencies>
<dependency>
<groupId>org.jacoco</groupId>
<artifactId>org.jacoco.ant</artifactId>
<version>0.5.6.2012</version>
</dependency>
<dependency>
<groupId>ant-contrib</groupId>
<artifactId>ant-contrib</artifactId>
<version>20020829</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>jacoco-report</id>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<taskdef name="jacoco-report"
classname="org.jacoco.ant.ReportTask"
classpathref="maven.plugin.classpath" />
<taskdef classpathref="maven.runtime.classpath"
resource="net/sf/antcontrib/antcontrib.properties" />
<available
file="${project.basedir}/target/jacoco.exec"
property="jacoco.exec.file.exists" />
<echo message="${project.basedir}/target/jacoco.exec" />
<if>
<equals arg1="${jacoco.exec.file.exists}"
arg2="true" />
<then>
<echo message="Executing jacoco report" />
<trycatch>
<try>
<jacoco-report>
<executiondata>
<file
file="${project.basedir}/target/jacoco.exec" />
</executiondata>
<structure name="Minerva">
<classfiles>
<fileset
dir="target/classes" />
<fileset dir="C:/Data/dev/m2Repository/com/groupama/framework/crypt/fwk-cryptage/1.0/">
<include name="**/*.jar"/>
</fileset>
</classfiles>
<sourcefiles
encoding="UTF-8">
<fileset
dir="src/main/java" />
</sourcefiles>
</structure>
<html destdir="${project.basedir}/target/jacoco/report" />
<xml destfile="${project.basedir}/target/jacoco/report/jacoco.xml"/>
</jacoco-report>
</try>
<catch>
<echo>skipping</echo>
</catch>
</trycatch>
</then>
<else>
<echo message="No jacoco.exec file found." />
</else>
</if>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
Sie haben Recht mit der Dokumentation, die wirklich vollständiger sein muss. Ich dachte wirklich, dass es die Laufaufgabe war, die parametrisiert werden musste; Sie haben mich dazu gebracht, in die Datei jacoco.exec zu schauen und zu erkennen, dass sie bereits Verweise auf Klassen innerhalb externer jars enthielt, was bedeutet, dass es der Bericht ist, der korrekt parametrisiert werden muss. Ich wusste nicht, Ameisen, verbrachte ich den ganzen Morgen, bevor Sie es zur Arbeit, aber es hat endlich funktioniert.Es befriedigt mich teilweise, sehe meine Antwort unten, aber es ist ein Schritt in die richtige Richtung. Vielen Dank trotzdem! – Guillaume
danke er Erhalte meinen Tag – vinod