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

Findbugs ant任务提交几个动态检测的JAR文件进行分析,ant,findbugs,Ant,Findbugs,我目前正在寻找对一个预先存在的项目进行静态分析。由于该项目是由一家非现场公司创建和提供的,因此我无法从根本上改变构建过程 该项目分为许多子模块,位于不同的位置。对于其他分析工具(JDepend、Google Testability Explorer等),我已经动态地将所有构建JAR文件检测到path元素中,如下所示: <path id="built-libs"> <fileset dir="${overall-base}"> <include name=

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

该项目分为许多子模块,位于不同的位置。对于其他分析工具(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" />
现在,我可以手动列出所有JAR文件,但这样做可能会导致该列表与其他工具的列表不同步,或者导致输入错误

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


我可以调用操作系统运行FindBugs,以空格分隔的列表形式传入jar(如中所示)。然而,我更喜欢Ant解决方案,而不是OS
理想情况下,FindBugs应该采用一个类,而不是单独的
元素。我不熟悉FindBugs,因此我无法解释为什么他们选择使用
元素路径而不是资源集合,但是您关于使用
exec
的评论意味着使用资源集合是一种有效的设计方案

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


另一种选择(这是一种丑陋的黑客行为)是使用
文件集
编写一个带有FindBugs目标的小型ant文件,然后使用任务调用该文件。抖动

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

除了指定class元素之外,或者不指定class元素,FindBugs 任务可以包含一个或多个文件集元素,这些元素指定要执行的文件 例如,您可以使用文件集指定 应该分析目录中jar文件的类型。”

在${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>


是的,我已经收集了罐子列表。定义宏的问题在于,我不喜欢调用Ant来运行Ant中存在的任务。更多的是个人的愤怒,只是感觉恶心。不过我可能会这么做,如果我被迫这么做的话,这对我来说比硬编码每个JAR更有意义。@GKelly,我同意通过
exec
调用是“讨厌的”,但你不应该对
java
任务有这种感觉。
java
任务只调用同一JVM中的java类(除非将
fork
设置为true)。当然,另一个选择是[创建您自己的Ant任务](编写您自己的任务)。
<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>