我已经安装了Ant和常春藤,以便我可以使用常春藤下载的JAR来运行PMD。尝试使用FindBugs,将findbugs.home
Ant属性设置为ivy-jars/findbugs
,即常春藤JAR。我最初得到的错误是找不到${findbugs.home}/lib
目录下的JAR文件。我通过更改Ivy将JAR文件下载到ivy-jars/findbugs/lib
来解决这个问题。但是,这引起了新的错误:
Executing findbugs FindBugsTask from ant task
Running FindBugs...
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/bcel/classfile/ClassFormatException
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
at java.lang.Class.getMethod0(Class.java:3018)
at java.lang.Class.getMethod(Class.java:1784)
at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
Caused by: java.lang.ClassNotFoundException: org.apache.bcel.classfile.ClassFormatException
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 7 more
答案 0 :(得分:2)
原来这是由三个问题引起的:
symlink="true"
检索了JAR文件。 FindBugs将符号链接解引用到findbugs.jar
并查找同一目录下的所有其他JAR文件,但是Ivy构建其缓存的方式只有findbugs.jar
在该目录中。不使用符号链接就可以很容易地解决这个问题。[artifact].[ext]
,有时格式为[artifact]-[revision].[ext]
,可以通过<ivy:retrieve>
两次pattern
来解决值。bcel-6.0-SNAPSHOT.jar
而不是bcel-findbugs.jar
或bcel-findbugs-6.0.jar
;这可以通过符号链接来修复。我认为这只是一种解决方法,而不是一个真正的解决方案,因为#2和#3不能像在Ivy下使用FindBugs 那样。因此,如果有人知道正确的方式,请提供更好的答案。
答案 1 :(得分:2)
与documentation相反,home
属性不是必需的。相反,您可以提供嵌套的classpath
元素,该元素可以是任何path-like structure。
以下Ant目标对我有用:
<target name="findbugs" description="Run findbugs on the code">
<ivy:retrieve/>
<ivy:cachepath pathid="findbugs.classpath" conf="findbugs"/>
<taskdef name="findbugs" classname="edu.umd.cs.findbugs.anttask.FindBugsTask" classpathref="findbugs.classpath"/>
<findbugs>
<classpath refid="findbugs.classpath"/>
<class location="my-analysis-target.jar"/>
</findbugs>
</target>
我的ivy.xml
位于:
<ivy-module version="2.0">
<info organisation="meh" module="meh"/>
<configurations defaultconfmapping="findbugs->default">
<conf name="findbugs"/>
</configurations>
<dependencies>
<dependency org="com.google.code.findbugs" name="findbugs" rev="3.0.1" conf="findbugs"/>
</dependencies>
</ivy-module>