我安装了Fedora 20 findbugs RPMs,然后设置我的Ant build.xml
文件:
<property name="findbugs.home" location="/usr/share/findbugs"/> <target name="findbugs" description="static bytecode analysis"> <taskdef name="findbugs" classname="edu.umd.cs.findbugs.anttask.FindBugsTask"> </taskdef> <findbugs home="${findbugs.home}" output="xml" outputFile="bcel-fb.xml"> <sourcePath path="${src.dir}"/> <fileset dir="${build.dir}"> <include name="**/*.class"/> </fileset> </findbugs> </target>
这给了我错误:
java.lang.IllegalArgumentException:在/ usr / share / findbugs / lib中找不到findbugs.jar
所以我把/usr/share/findbugs/lib
作为/usr/share/java
的符号链接,在这里findbugs.jar
在这里。 这让我更进一步,但现在它吐出来:
findbugs: [findbugs] Executing findbugs from ant task [findbugs] Running FindBugs... [findbugs] Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/bcel/classfile/ClassFormatException
strace
显示它find并打开/usr/share/java/findbugs-bcel.jar
,所以我不知道为什么它不能加载类。 显式添加/usr/share/java/findbugs-bcel.jar
到taskdef的类path不会改变任何东西。
注意 :我不想在BCEL上运行FindBugs。 FindBugs使用BCEL来进行分析,而我自己的代码根本不使用BCEL。
你需要一个<Auxclasspath/>
指向编译时使用的类路径。 Findbugs使用内置的*.class
文件,并且需要源代码在源代码中指出错误的位置,正在分析的类以及所有第三方jar的类路径,以便能够理解代码:
<findbugs home="${findbugs.home}" output="xml" outputFile="bcel-fb.xml"> <auxClasspath refid="main.classpath"/> <!-- Third party jars classpath --> <class location="${main.destdir}"/> <!-- Class files you're analyzing --> <sourcePath path="${main.srcdir}"/> <!-- Source directory --> </findbugs>
顺便说一句,你应该把findbugs jar放到你的项目中(我的首选项在${basedir}/antlib/findbugs
)并在<taskdef/>
:
<taskdef name="findbugs" classname="edu.umd.cs.findbugs.anttask.FindBugsTask"> <classpath> <fileset dir="${basedir}/antlib/findbugs"/> </classpath> </taskdef>
这样,Findbugs是你的项目的一部分。 任何签出项目的人都会自动拥有findbugs jar,并且能够运行findbugs任务,而无需下载jar并将其安装到$ANT_HOME/lib
。
我使用任何可选的Ant任务罐(如PMD,Checkstyle和Ant-Contrib)来执行此操作。 这使得其他人能够更容易地运行我的构建,并且我花费更少的时间来向人们解释他们可以获得那个jar以及如何安装它。 另外,如果你使用像Jenkins这样的连续编译系统,你不必在任何时候添加一个新的可选jar包来与服务器对抗。
尝试使用这个,
添加任务定义
<taskdef name="findbugs" classname="edu.umd.cs.findbugs.anttask.FindBugsTask"/>
定义目标
<property name="findbugs.home" value="/export/home/daveho/work/findbugs" /> <target name="findbugs" depends="jar"> <findbugs home="${findbugs.home}" output="xml" outputFile="bcel-fb.xml" > <auxClasspath path="${basedir}/lib/Regex.jar" /> <sourcePath path="${basedir}/src/java" /> <class location="${basedir}/bin/bcel.jar" /> </findbugs> </target>
该目标将在bcel.jar上执行FindBugs,这是由BCEL构建脚本生成的Jar文件。 (通过取决于“jar”目标,我们确保在运行FindBugs之前,库已经被完全编译。)FindBugs的输出将以XML格式保存到一个名为bcel-fb.xml的文件中。 辅助Jar文件Regex.jar被添加到辅助类路径中,因为它是由主BCEL库引用的。 指定源路径,以便保存的错误数据将具有对BCEL源代码的精确引用。
欲了解更多信息 。
如果findbugs不在以下位置: <property name="findbugs.home" location="/usr/share/findbugs"/>
我会将您的Ant Findbugs配置更改为Findbug库文件的位置:
<property name="findbugs.home" location="/usr/share/java"/>
甚至, <property name="findbugs.home" location="/usr/share/java/findbugs"/>
该目录。
它看起来像一个类路径问题。
根据Richard Fearn [1],Fedora重新包装findbugs jar并修改FB库类的加载方式,所以通过使用fedora中的findbug,必须使用下面的解决方法。 查看findbugs的原始bug请求[2]。
从[1]引用:
作为一种解决方法,可以这样做:
<findbugs classpath="/usr/share/java/findbugs.jar:/usr/share/java/ant/ant-findbugs.jar:/usr/share/java/apache-commons-lang.jar:/usr/share/java/dom4j.jar:/usr/share/java/findbugs-bcel.jar:/usr/share/java/jaxen.jar:/usr/share/java/jcip-annotations.jar:/usr/share/java/jFormatString.jar:/usr/share/java/jsr-305.jar:/usr/share/java/junit.jar:/usr/share/java/objectweb-asm/asm.jar:/usr/share/java/objectweb-asm/asm-commons.jar:/usr/share/java/objectweb-asm/asm-tree.jar">
该类路径是来自以下的输出:
$ build-classpath
cat /etc/ant.d/findbugs
虽然不完全匹配问题中的Fedora包案例,但是我尝试使用Ivy来获取FindBugs(3.0.1),而不是从.zip发行版安装。 在获取的内容和findbugs期望的内容之间似乎存在一些错误匹配。
最后,我在ivy.xml中使用了这个依赖:
<dependency org="com.google.code.findbugs" name="findbugs" rev="3.0.1" conf="findbugs->default" />
在我的ant build.xml中(在设置所有工具的'bootstrap'任务中):
<property name="findbugs.home" value="${basedir}/tools/findbugs" /> <property name="findbugs.lib" value="${findbugs.home}/lib" /> <ivy:resolve file="${basedir}/tools/ivy.xml" conf="findbugs" trransitive="true"/> <ivy:retrieve conf="findbugs" transitive="true" pattern="${findbugs.lib}/[artifact]-[revision].[ext]"/>
这给了一棵树:
AppleJavaExtensions-1.4.jar asm-5.0.2.jar asm-commons-5.0.2.jar asm-debug-all-5.0.2.jar asm-tree-5.0.2.jar bcel-findbugs-6.0.jar commons-lang-2.6.jar dom4j-1.6.1.jar findbugs-3.0.1.jar jaxen-1.1.6.jar jcip-annotations-1.0.jar jFormatString-2.0.1.jar jsr305-2.0.1.jar xml-apis-1.0.b2.jar
解决这个问题的关键是findbugs-3.0.1.jar
想要使用它自己的MANIFEST.MF
指定的类路径:
Class-Path: bcel-6.0-SNAPSHOT.jar dom4j-1.6.1.jar jaxen-1.1.6.jar asm-debug-all-5.0.2.jar jsr305.jar jFormatString.jar commons-lang-2.6.jar
它也想命名为findbugs.jar
否则会发生不同的错误。 因此,在Ivy步骤之后,使用Ant重命名.jars:
<move file="${findbugs.lib}/findbugs-3.0.1.jar" tofile="${findbugs.lib}/findbugs.jar"/> <move file="${findbugs.lib}/jFormatString-2.0.1.jar" tofile="${findbugs.lib}/jFormatString.jar"/> <move file="${findbugs.lib}/jsr305-2.0.1.jar" tofile="${findbugs.lib}/jsr305.jar"/> <move file="${findbugs.lib}/bcel-findbugs-6.0.jar" tofile="${findbugs.lib}/bcel-6.0-SNAPSHOT.jar"/>
最后定义Ant的taskdef:
<taskdef name="findbugs" classname="edu.umd.cs.findbugs.anttask.FindBugsTask"> <classpath> <fileset dir="${findbugs.lib}" includes="*.jar" /> </classpath> </taskdef>
Findbugs使用它自己的私人修改版本的BCEL。 确保你的类路径正在使用FindBugs中的一个