首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >org.apache.bcel.classfile.ClassFormatException无法定位FindBugs

org.apache.bcel.classfile.ClassFormatException无法定位FindBugs
EN

Stack Overflow用户
提问于 2014-02-15 09:25:09
回答 6查看 3.2K关注 0票数 8

我安装了Fedora 20 findbugs,并设置了Ant build.xml文件:

代码语言:javascript
复制
<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/findbug/lib中找不到findbugs.jar

因此,我将/usr/share/findbugs/lib作为/usr/share/java的一个象征性链接,findbugs.jar就住在这里。这让我走得更远了,但现在又吐出来了:

代码语言:javascript
复制
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,所以我不知道它为什么不能加载这个类。显式地向taskdef的类路径添加/usr/share/java/findbugs-bcel.jar不会改变任何事情。

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

EN

回答 6

Stack Overflow用户

发布于 2014-02-18 01:17:02

您需要一个指向编译时使用的类路径的<Auxclasspath/>子实体。Findbug使用构建的*.class文件,并需要源代码在错误所在的源代码中定位、分析的类以及所有第三方jars的类路径,以便能够理解代码:

代码语言:javascript
复制
 <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放在您的项目中(我的首选是${basedir}/antlib/findbugs),并在<taskdef/>中使用它。

代码语言:javascript
复制
<taskdef name="findbugs" 
    classname="edu.umd.cs.findbugs.anttask.FindBugsTask">
    <classpath>
       <fileset dir="${basedir}/antlib/findbugs"/>
    </classpath>
</taskdef>

这样,Findbug是项目的一部分。任何签出项目的人都将自动拥有findbugs,并且能够运行findbug任务,而无需下载jar并将其安装在$ANT_HOME/lib中。

我使用任何可选的Ant任务jars来完成这个任务,比如PMD、Checkstyle和Ant-cont肋骨。这使得其他人可以更容易地运行我的构建,我花了更少的时间试图向人们解释他们在哪里可以得到这个罐子,以及如何安装它。另外,如果您使用像Jenkins这样的连续构建系统,那么在添加一个新的可选jar时,您不需要对服务器进行修改。

票数 5
EN

Stack Overflow用户

发布于 2014-02-24 12:26:42

试着用这个

添加任务定义

代码语言:javascript
复制
<taskdef name="findbugs" classname="edu.umd.cs.findbugs.anttask.FindBugsTask"/>

定义目标

代码语言:javascript
复制
<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>

这个目标将在FindBugs上执行bcel.jar,这是BCEL的构建脚本生成的Jar文件。(通过使它依赖于"jar“目标,我们确保库在运行FindBugs之前是完全编译的。)FindBugs的输出将以XML格式保存到一个名为bcel-fb.xml的文件中。辅助Jar文件Regex.jar被添加到aux类路径中,因为它是由主BCEL库引用的。指定了源路径,以便保存的bug数据能够准确引用BCEL源代码。

关于更多的信息

票数 2
EN

Stack Overflow用户

发布于 2014-02-22 21:50:31

如果findbug不位于:<property name="findbugs.home" location="/usr/share/findbugs"/>

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

<property name="findbugs.home" location="/usr/share/java"/>,甚至,<property name="findbugs.home" location="/usr/share/java/findbugs"/>是这个目录。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21795698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档