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

Mat*_*ine 8 java linux ant findbugs fedora

我安装了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>
Run Code Online (Sandbox Code Playgroud)

这给了我错误:

java.lang.IllegalArgumentException:在/ usr/share/findbugs/lib中找不到findbugs.jar

所以我在生活的地方建立/usr/share/findbugs/lib了一个象征性的联系.这让我更进一步,但现在它吐了出来:/usr/share/javafindbugs.jar

findbugs:
 [findbugs] Executing findbugs from ant task
 [findbugs] Running FindBugs...
 [findbugs] Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/bcel/classfile/ClassFormatException
Run Code Online (Sandbox Code Playgroud)

strace显示它已找到并打开/usr/share/java/findbugs-bcel.jar,所以我不知道为什么它无法加载该类.显式添加/usr/share/java/findbugs-bcel.jar到taskdef的类路径不会改变任何东西.

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

Dav*_* W. 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>
Run Code Online (Sandbox Code Playgroud)

顺便说一句,你应该把findbugs jar放在你的项目中(我的偏好将${basedir}/antlib/findbugs在你的下面)并在你的<taskdef/>:

<taskdef name="findbugs" 
    classname="edu.umd.cs.findbugs.anttask.FindBugsTask">
    <classpath>
       <fileset dir="${basedir}/antlib/findbugs"/>
    </classpath>
</taskdef>
Run Code Online (Sandbox Code Playgroud)

这样,Findbugs就是您项目的一部分.检查你的项目的任何人都将自动拥有findbugs jar,并且能够运行你的findbugs任务,而无需下载jar并安装它$ANT_HOME/lib.

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