FindBugs找不到org.apache.bcel.classfile.ClassFormatException

我安装了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

[1] https://bugzilla.redhat.com/show_bug.cgi?id=1080682#c4

[2] https://sourceforge.net/p/findbugs/bugs/1255/

虽然不完全匹配问题中的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中的一个