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

时间:2014-02-15 09:25:09

标签: java linux ant fedora findbugs

我安装了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显示它找到并打开了/usr/share/java/findbugs-bcel.jar,因此我不知道为什么它无法加载该类。将/usr/share/java/findbugs-bcel.jar显式添加到taskdef的类路径中不会改变任何内容。

注意:我不打算在BCEL上运行FindBugs。 FindBugs使用BCEL进行分析,我自己的代码根本不使用BCEL。

6 个答案:

答案 0 :(得分:5)

您需要一个<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,并且无需下载jar并将其安装在$ANT_HOME/lib中即可运行findbugs任务。

我使用任何可选的Ant任务jar(如PMD,Checkstyle和Ant-Contrib)执行此操作。它使其他人能够更容易地运行我的构建,并且我花更少的时间尝试向他们可以获得该jar的人解释,以及如何安装它。另外,如果您使用像Jenkins这样的连续构建系统,则无需在添加新的可选jar时随时使用服务器。

答案 1 :(得分:2)

尝试使用它,

添加任务定义

<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被添加到aux类路径中,因为它由主BCEL库引用。指定源路径,以便保存的错误数据将准确引用BCEL源代码。

了解更多info

答案 2 :(得分:1)

如果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"/>这是目录。

它看起来像一个类路径问题。

答案 3 :(得分:1)

根据Richard Fearn [1] Fedora重新包装findbugs jar并修改FB库类的加载方式,因此通过使用fedora中的findbugs,必须使用下面描述的解决方法。有关findbugs的原始错误请求,另请参阅[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/

答案 4 :(得分:1)

虽然不完全匹配问题中的Fedora包案例,但是我试图使用Ivy来获取FindBugs(3.0.1),而不是从.zip发行版中安装它。在获取的内容和findbugs期望的内容之间似乎存在许多不匹配。

最后我在ivy.xml中使用了这个依赖:

@echo off
setlocal enabledelayedexpansion
set req_tags=SN SP UUID MACADDR cUUID
set inFile="C:\tests\xmltocsv.txt"
set outFile="C:\tests\output.csv"
if exist %outFile% del %outFile%

rem set the header line
set hLine=
for %%a in (%req_tags%) do (
  set hLine=!hLine!,%%a
)
call :outputlinetocsv "%hLine%"

rem add values to file
set csvLine=
for %%a in (%req_tags%) do (
  set sTag=%%a
  for /F "tokens=2 delims=<>" %%f in ('findstr /I /L "^</!sTag!" %inFile%') do (
    set line=%%f
    set "line=!line:*>=!"
    set csvLine=!csvLine!,!line!
  )
)
call :outputlinetocsv "%csvLine%"
goto :eof

:outputlinetocsv
REM remove starting comma
set myLine=%~1
set "myLine=!myLine:*,=!"
echo !myLine! >> %outFile%
goto :eof

在我的ant build.xml中有以下内容(在设置所有工具的&#39; bootstrap&#39;任务中):

<dependency org="com.google.code.findbugs" name="findbugs" rev="3.0.1" conf="findbugs->default" />

这给出了一棵树:

<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 ,否则会发生不同的错误。 因此,在常春藤步骤之后,使用Ant:

重命名.jars
findbugs.jar

最后定义Ant taskdef:

    <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"/>

答案 5 :(得分:0)

Findbugs使用它自己的BCEL私人修改版本。确保您的类路径使用Findbugs

中的路径