如何使用jacoco获得外部java库的代码覆盖率?
如果我有一个使用库(jar文件)的java项目,是否有可能获得此jar中类的代码覆盖率?
这背后的想法是,我想找出该项目所依赖的外部库的比例(假设spring,hibernate,或者如果它是一个scala项目,它可能是scala jars,为什么不呢)实际使用。我甚至想象我可以尝试列出它们并将它们重新捆绑在一个jar中,该jar仅包含必要的.class文件(例如,使用apache felix之类的插件),以获得尽可能小的jar。我不确定我是否真的想这样做,我知道这可能是一个坏主意,原因有很多,但我认为这是一个实验。
我找不到如何做到这一点,jacoco只报告直接在我的项目中的类文件的报道。也许我做错了什么,我正在使用像这样的maven插件:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.5.6.201201232323</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>
我尝试过更改 include 标记,但唯一的效果是限制默认值,其中仅包含直接位于项目中的类文件。
提前致谢!
在 oers 的答案之后编辑 :
我发现了如何使用ant和antrun插件来做到这一点,尽管它非常复杂,但我在antrun插件版本上遇到了很多麻烦(无法使最新版本工作,即使是基本任务),我真的很想坚持使用Maven。如果有人知道如何用je jacoco maven插件而不是蚂蚁来做等价物,我很感兴趣!
ant的部分解决方案:实际上jacoco.exec文件已经包含对我的外部jars类的引用;因此,应该告诉报告任务要考虑这些jar,而不是我想象的运行时阶段。以下是我使用的maven配置(我在 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.201201232323</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>