对于我的一生,我试图让 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 下有一个名为 的 JAR bcel-1.0.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>
但是当我从命令行运行时ant -buildfile build.xml echoMsg
,我在 FindBugs 中得到一个错误:
run-findbugs:
[echo] Creating gen/staging/myapp-build-findbugs-temp.jar for FindBugs.
[jar] Building jar: /home/myuser/sandbox/workbench/eclipse/workspace/myapp/gen/staging/myapp-build-findbugs-temp.jar
[echo] Conducting code quality tests with FindBugs.
[fb:findbugs] Executing findbugs from ant task
[fb:findbugs] Running FindBugs...
[fb:findbugs] Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/bcel/classfile/ClassFormatException
[fb:findbugs] Caused by: java.lang.ClassNotFoundException: org.apache.bcel.classfile.ClassFormatException
[fb:findbugs] at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
[fb:findbugs] at java.security.AccessController.doPrivileged(Native Method)
[fb:findbugs] at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
[fb:findbugs] at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
[fb:findbugs] at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
[fb:findbugs] at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
[fb:findbugs] Could not find the main class: edu.umd.cs.findbugs.FindBugs2. Program will exit.
[fb:findbugs] Java Result: 1
[fb:findbugs] Output saved to gen/audits/qual/findbugs.html
echoMsg:
[echo] The build is still alive!!!
这让我感到惊讶:
- 即使使用
failOnError="true"
,即使遇到此运行时异常,FindBugs 也不会停止构建 - 最后一段输出“
Output saved to gen/audits/qual/findbugs.html
”是骗人的!里面什么都没有gen/audits/qual
! - 它
bcel-1.0.jar
绝对位于 FindBugs 的主目录下,就像 lib/ 目录中的所有其他 JAR 一样。
请注意:findbugs-ant.jar
绝对复制到 ANT_HOME/lib;否则我会得到一个失败的构建,抱怨它找不到 Ant 任务。作为一个健全的检查,我继续这样做(我findbugs-ant.jar
从 ANT_HOME/lib 中删除了并且构建失败)。这个构建不会失败(它成功了!)。它只是不运行 findbugs。
谁能发现这里发生了什么?提前致谢!