Findbugs ant任务提交几个动态检测到的JAR文件进行分析

时间:2011-11-07 15:17:27

标签: ant findbugs

我目前正在寻找对预先存在的项目进行静态分析。由于项目是由一个非现场公司创建和提供的,我无法彻底改变构建过程。

该项目分为许多子模块,分布在不同的地方。对于其他分析工具(JDepend,Google Testability Explorer等),我已将所有构建JAR文件动态检测到path元素,如下所示:

<path id="built-libs">
  <fileset dir="${overall-base}">
    <include name="${some-common-base}/**/lib/*.jar" />
  </fileset>
</path>
<property name="built-libs-string" refid="built-libs" />

对于某些工具,我使用build-libs,其他人使用字符串(在类路径表单中; x.jar;y.jar)。

麻烦的是,FindBugs使用与其他任何格式完全不同的格式;

<class location="x.jar"/>
<class location="y.jar"/>
...

现在,我可以手动列出所有JAR文件,但是然后冒这个列表与其他工具列表不一致或者引入拼写错误的风险。

另一个复杂因素是我还想在Jenkins中运行报告,在这种情况下,各个模块的提取目录将取决于之前构建模块的作业(管道构建,从SCM提取并并行构建的模块,报告发生在管道末尾。)

可以调用操作系统来运行FindBugs,在空格分隔列表中传递JAR(如Invoking FindBugs from Ant: passing a space-separated list of files to java中所示)。但是,我更喜欢Ant解决方案来解决操作系统<exec...

注意我知道我对sourcepath元素有类似的问题,但是,我假设解决class元素问题也解决了sourcepath一个。

2 个答案:

答案 0 :(得分:1)

理想情况下,FindBugs应该采用resource collection而不是单独的class元素。我不熟悉FindBugs,所以我无法评论为什么他们选择了class元素路由而不是资源集合,但是关于使用exec的评论意味着使用资源集合是一种有效的设计选择。

我会尝试使用Ant macro任务滚动您自己的invokes FindBugs directly java。这应该为您提供所需的控制,并避免FindBugs Ant任务将引入的冗余。

另一个选项(这是一个丑陋的黑客)是使用fileset编写一个带有FindBugs目标的迷你ant文件,然后使用ant任务调用该文件。 战栗

答案 1 :(得分:0)

Findbugs Ant任务允许您指定可用于指定多个文件的文件列表。引自Findbugs documentation

  

&#34;除了指定类元素之外或代替指定类元素,FindBugs   task可以包含一个或多个指定文件的文件集元素   进行分析。例如,您可以使用文件集指定all   应该分析目录中的jar文件。&#34;

包含$ {lib.dir}所有jar的示例:

<findbugs home="${findbugs.home}" output="xml" outputFile="findbugs.xml" >
    <auxClasspath path="${basedir}/lib/Regex.jar" />
    <sourcePath path="${basedir}/src/java" />
    <fileset dir="${lib.dir}">
       <include name="*.jar"/>
    </fileset>
</findbugs>