我安装了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。
答案 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
答案 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:
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
中的路径