如何从Ivy下载的JAR运行FindBugs

时间:2015-06-09 03:02:05

标签: java ant ivy findbugs

我已经安装了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  

2 个答案:

答案 0 :(得分:2)

原来这是由三个问题引起的:

  1. 我使用symlink="true"检索了JAR文件。 FindBugs将符号链接解引用到findbugs.jar并查找同一目录下的所有其他JAR文件,但是Ivy构建其缓存的方式只有findbugs.jar在该目录中。不使用符号链接就可以很容易地解决这个问题。
  2. FindBugs希望其JAR文件有时具有文件名格式[artifact].[ext],有时格式为[artifact]-[revision].[ext],可以通过<ivy:retrieve>两次pattern来解决值。
  3. FindBugs希望BCEL JAR文件的文件名完全为bcel-6.0-SNAPSHOT.jar而不是bcel-findbugs.jarbcel-findbugs-6.0.jar;这可以通过符号链接来修复。
  4. 我认为这只是一种解决方法,而不是一个真正的解决方案,因为#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>