2012-04-18 8 views
7

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> 

Antwort

1

Sie müssen den Bericht Ziel, die Klassen der Bibliothek, die Sie analysieren möchten geben. Leider kann ich dazu keine Dokumentation finden. The official docu is ... hm ... sparse

Wenn Sie ameise ausführen können, würde ich vorschlagen, die report task suchen.

<jacoco:report> 

    <executiondata> 
     <file file="jacoco.exec"/> 
    </executiondata> 

    <structure name="Example Project"> 
     <classfiles> 
      <fileset dir="classes"/> <!-- HERE THE CLASSES FROM YOUR LIB --> 
     </classfiles> 
     <sourcefiles encoding="UTF-8"> 
      <fileset dir="src"/> <!-- HERE THE SORUCESFROM YOUR LIB --> 
     </sourcefiles> 
    </structure> 

    <html destdir="report"/> 

</jacoco:report> 
+0

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

+0

danke er Erhalte meinen Tag – vinod

0

Obwohl diese Frage alt ist, scheint sie immer noch relevant. Wenn die externe Bibliothek ein Maven-Projekt ist, können Sie in die Bibliothek Quellverzeichnis gehen und fordern JaCoCo Bericht erhalten vorher mit Ihrem Testsuite aus dort:

mvn org.jacoco:jacoco-maven-plugin:0.7.8:report -Djacoco.dataFile=/path/to/jacoco.exec 

erhalten Sie den Bericht in $ {Projekt}/target/site/jacoco-Verzeichnis.

Verwandte Themen