Java FindBugs拒绝在类路径上找到bcel jar
就我个人而言,我正试图让FindBugs(2.0.1)作为我的命令行Ant构建的一部分运行。我下载了FindBugs JAR并将其解压缩到/home/myuser/java/repo/umd/FindBugs/2.0.1/FindBugs-2.0.1: 正如您在屏幕截图中看到的,在/home/myuser/java/repo/umd/findbugs/2.0.1/findbugs-2.0.1/lib下有一个名为Java FindBugs拒绝在类路径上找到bcel jar,java,ant,findbugs,Java,Ant,Findbugs,就我个人而言,我正试图让FindBugs(2.0.1)作为我的命令行Ant构建的一部分运行。我下载了FindBugs JAR并将其解压缩到/home/myuser/java/repo/umd/FindBugs/2.0.1/FindBugs-2.0.1: 正如您在屏幕截图中看到的,在/home/myuser/java/repo/umd/findbugs/2.0.1/findbugs-2.0.1/lib下有一个名为bcel-1.0.JAR的JAR,如果您打开它,您可以看到我已经深入到了一个名为or
bcel-1.0.JAR
的JAR,如果您打开它,您可以看到我已经深入到了一个名为org.apache.bcel.classfile.ClassFormatException
的类。保持这种想法
然后,我将/home/myuser/java/repo/umd/findbugs/2.0.1/findbugs-2.0.1/lib/findbugs-ant.jar复制到${env.ant_home}/lib,以使从命令行运行的ant版本可以访问它(而不是Eclipse中内置的ant实例)
我的项目目录结构如下:
/home/myuser/sandbox/workbench/eclipse/workspace/myapp/
src/
main/
java/
test/
java/
build/
build.xml
build.properties
gen/
bin/
main/ --> where all main Java class files compiled to
test/ --> where all test Java class files compiled to
audits/
qual/
staging/
内部build.xml
:
<project name="myapp-build" basedir=".." default="package"
xmlns:fb="antlib:edu.umd.cs.findbugs">
<path id="findbugs.source.path">
<fileset dir="src/main/java">
<include name="**.*java"/>
</fileset>
<fileset dir="src/main/test">
<include name="**.*java"/>
</fileset>
</path>
<taskdef name="findbugs" classname="edu.umd.cs.findbugs.anttask.FindBugsTask"
uri="antlib:edu.umd.cs.findbugs"/>
<!-- Other Ant target omitted for brevity. -->
<target name="run-findbugs">
<!-- Create a temp JAR that FindBugs can use for analysis. -->
<property name="fb.tmp.jar" value="gen/staging/${ant.project.name}-findbugs-temp.jar"/>
<echo message="Creating ${fb.tmp.jar} for FindBugs."/>
<jar destfile="gen/staging/${ant.project.name}-findbugs-temp.jar">
<fileset dir="gen/bin/main" includes="**/*.class"/>
<fileset dir="gen/bin/test" includes="**/*.class"/>
</jar>
<echo message="Conducting code quality tests with FindBugs."/>
<fb:findbugs home="/home/myuser/java/repo/umd/findbugs/2.0.1/findbugs-2.0.1"
output="html" outputFile="gen/audits/qual/findbugs.html" stylesheet="fancy-hist.xsl" failOnError="true">
<sourcePath refid="findbugs.source.path"/>
<class location="${fb.tmp.jar}"/>
</fb:findbugs>
</target>
<target name="echoMsg" depends="run-findbugs">
<echo message="The build is still alive!!!"/>
</target>
</project>
以下是令我惊讶的事情:
- 即使使用
,FindBugs也不会停止生成,即使遇到此运行时异常failOnError=“true”
- 最后一段输出“
保存到gen/audits/qual/findbugs.html的输出”是个谎言!
中没有任何内容李>gen/audits/qual
绝对位于FindBugs home下,就像lib/目录中的其他jar一样bcel-1.0.jar
findbugs ant.jar
,得到了一个失败的构建)。这个构建没有失败(它成功了!)。它只是不运行findbugs
有人能看出这里发生了什么事吗?提前谢谢 我猜类路径中实际上有两次BCEL。文件是从FindBugs库外部的jar加载的。然后,当FindBugs尝试加载jar时,它会在FindBugs库中找到BCEL,并且无法加载它,因为它已经加载了
解决方案是找到类路径中的其他BCEL并将其删除。您可能必须定义一个AuxClasspath,以包含编译类文件时任务使用的类路径 您没有显示编译是如何发生的,因此我假设您创建了一个
compile.classapath
classpath引用:
<javac destdir="gen/bin/main"
srcdir="src/main/java"
classpathref="compile.classpath"/>
<fb:findbugs home="/home/myuser/java/repo/umd/findbugs/2.0.1/findbugs-2.0.1"
output="html" outputFile="gen/audits/qual/findbugs.html" stylesheet="fancy-hist.xsl" failOnError="true">
<auxClasspath refid="compile.classpath"/>
<sourcePath refid="findbugs.source.path"/>
<class location="${fb.tmp.jar}"/>
</fb:findbugs>
您可以使用-verbose:class参数在jvm中调试BCEL的加载位置 要将此参数传递给运行findbugs的jvm,请在findbugs插件上使用jvmargs标志 jvmargs 可选属性。它指定了任何应该使用的参数 传递给用于运行FindBugs的Java虚拟机。你可能需要 使用此属性指定标志以增加 如果您正在分析一个非常大的程序,JVM可能使用的内存
您是如何填充find bugs lib jar的?当我下载findbugs.zip时,我得到一个lib目录,它看起来与您显示的非常不同。特别是,我的包含一个bcel,其版本为5.3,而不是如您所示的1.0。我从您的Ant脚本中看不到bcel在findbugs任务能够加载它的任何类路径上。您可能希望尝试使taskdef明确包含findbugs需要的所有内容
<taskdef name="findbugs" classname="edu.umd.cs.findbugs.anttask.FindBugsTask"
uri="antlib:edu.umd.cs.findbugs">
<classpath>
<fileset dir="/home/java/repo/umd/findbugs/2.0.1/findbugs-2.0.1">
<include name="*.jar"/>
</fileset>
</classpath>
</taskdef>
有趣的是,我使用的是相同版本的Findbugs,jar文件名为bcel.jar
而不是bcel-1.0.jar
。我还从Ant
脚本运行Findbugs。听起来很疯狂,再次尝试下载Findbugs,将其解包到当前的位置,然后再次运行脚本。大多数可以调试的类路径问题。它将报告项目中的所有JAR。所有重复的课程等节省了我很多时间
还有一个ant任务准备就绪:这是一个很好的建议@Zagrev(+1)我将在几分钟后尝试一下。只是出于好奇,是什么让你怀疑这是真的?我这么问是因为我在1000年内都不会想到它,这是有道理的!(我最近肯定在其他地方添加了这个JAR…)可怕、可怕的经历:)好吧,这花了一段时间,但我检查了
ANT_HOME/lib
下以及我的FindBugs主目录中的每个JAR文件,bcel-1.0.JAR
是唯一包含该类的JAR。还有其他想法吗??再次感谢!请参见Thank@David W.(+1)-添加了auxClasspath
,但仍然存在相同的错误。我真的觉得Zagrev可能已经有了复制罐子的想法,但我似乎找不到它。我想知道,是否有一个工具可以让我将ANT_HOME/lib目录指向,并让它打印出该目录中每个JAR中每个Java类的列表?这样我就可以扫描输出中重复的BCEL类。@pnongrata“有没有一个工具,我可以将我的ANT_HOME/lib目录指向它,并让它打印出该目录中每个JAR中每个Java类的列表?”看一看。谢谢@sbridges,我会查出来的-我使用的是Ant 1.8.4,我想你的bcel版本错了。如果我下载findbugs 2.0.1.zip,它包含的bcel是5.0.3
<taskdef name="findbugs" classname="edu.umd.cs.findbugs.anttask.FindBugsTask"
uri="antlib:edu.umd.cs.findbugs">
<classpath>
<fileset dir="/home/java/repo/umd/findbugs/2.0.1/findbugs-2.0.1">
<include name="*.jar"/>
</fileset>
</classpath>
</taskdef>