【问题标题】:FindBugs can't locate org.apache.bcel.classfile.ClassFormatExceptionFindBugs 找不到 org.apache.bcel.classfile.ClassFormatException
【发布时间】:2014-02-15 09:25:09
【问题描述】:

我安装了 Fedora 20 findbugs RPM,然后设置了我的 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。

【问题讨论】:

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

标签: java linux ant fedora findbugs


【解决方案1】:

您需要一个&lt;Auxclasspath/&gt; 子实体,指向您在编译时使用的类路径。 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 下)并在你的 &lt;taskdef/&gt; 中使用它:

<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 任务 jar 来执行此操作,例如 PMD、Checkstyle 和 Ant-Contrib。它使其他人能够更轻松地运行我的构建,并且我花更少的时间尝试向人们解释他们在哪里可以获得该 jar,以及如何安装它。另外,如果您使用像 Jenkins 这样的持续构建系统,则在添加新的可选 jar 时,您不必在任何时候都使用服务器。

【讨论】:

  • 1) 我尝试添加&lt;auxClasspath&gt; 元素,但没有帮助;和以前一样的错误。 2)手册说该元素是“一个可选的嵌套元素,它指定一个类路径......包含被分析的库或应用程序使用的类,但你不想分析”。我没有在我的应用程序中使用 BCEL 库,所以我不明白为什么它会帮助 FindBugs 加载 用于进行分析的库之一。
【解决方案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 被添加到辅助类路径中,因为它被主 BCEL 库引用。指定源路径,以便保存的错误数据准确引用 BCEL 源代码。

更多info

【讨论】:

  • @Matthew Cline 您是否尝试过上述解决方案>您是否仍然面临问题?
  • 我并没有尝试在 on BCEL 上运行 FindBugs,而是 FindBugs 使用 BCEL 来分析我自己的代码。
  • 这可能是因为您使用的是相同版本的 Findbugs 并且 jar 文件名为 bcel.jar 而不是 bcel-1.0.jar。您还从 Ant 脚本运行 Findbugs。尝试再次下载 Findbugs,将其解压缩到您当前的位置并再次运行您的脚本。
  • 尝试再次下载 findbugs 并根据 findbugs 需要的版本更新您的 bcel.jar。
  • 我还了解到您没有在 bcel 上运行 findbugs,但代码只是 findbugs 和设置依赖 jar 的演示。
【解决方案3】:

如果 findbugs 不在: &lt;property name="findbugs.home" location="/usr/share/findbugs"/&gt;

我会将您的 Ant Findbugs 配置更改为 Findbug 库文件的位置:

&lt;property name="findbugs.home" location="/usr/share/java"/&gt; 甚至, &lt;property name="findbugs.home" location="/usr/share/java/findbugs"/&gt;是这个目录吗。

看起来确实是类路径问题。

【讨论】:

  • 我尝试按照建议更改 findbugs 主页,但没有帮助。另外,/usr/share/findbugs/etc/script.properties 包含findbugs_home=/usr/share/findbugs,所以我很确定/usr/share/findbugs 是正确的家。
【解决方案4】:

根据 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">

该类路径是来自哪里的输出:

$ 构建类路径cat /etc/ant.d/findbugs

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

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

【讨论】:

    【解决方案5】:

    虽然与问题中的 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 中包含以下内容(在设置所有工具的“引导”任务中):

    <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中指定的classpath:

    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 重命名 .jar:

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

      • strace 表明它已成功打开自己的 BCEL jar 文件,所以这不是问题。
      猜你喜欢
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-30
      • 1970-01-01
      • 2012-06-08
      相关资源
      最近更新 更多