【问题标题】:How to run FindBugs off of Ivy downloaded JARs如何从 Ivy 下载的 JAR 中运行 FindBugs
【发布时间】:2015-08-23 16:43:50
【问题描述】:

我已经安装了 Ant 和 Ivy,这样我就可以使用 Ivy 下载的 JAR 来运行 PMD。尝试使用 FindBugs 进行相同的操作,将 findbugs.home Ant 属性设置为 ivy-jars/findbugs,即 Ivy 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  

【问题讨论】:

    标签: java ant ivy findbugs


    【解决方案1】:

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

    1. 我使用 symlink="true" 检索了 JAR 文件。 FindBugs 取消对findbugs.jar 的符号链接的引用,并在同一目录下查找其所有其他 JAR 文件,但 Ivy 构造其缓存的方式只有 findbugs.jar 位于该目录中。这可以通过不使用符号链接轻松解决。
    2. FindBugs 希望其 JAR 文件有时具有 [artifact].[ext] 的文件名格式,有时具有 [artifact]-[revision].[ext] 的格式,这可以通过使用不同的 pattern 值执行两次 <ivy:retrieve> 来解决。
    3. FindBugs 希望 BCEL JAR 文件的文件名准确为 bcel-6.0-SNAPSHOT.jar 而不是 bcel-findbugs.jar 或 bcel-findbugs-6.0.jar;这可以通过符号链接来解决。

    我认为这只是一种解决方法,而不是真正的解决方案,因为 #2 和 #3 不可能是 FindBugs 打算在 Ivy 下使用的方式。因此,如果有人知道正确的方法,请提供更好的答案。

    【讨论】:

      【解决方案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>
      

      【讨论】:

        猜你喜欢
        • 2015-05-29
        • 2012-04-28
        • 1970-01-01
        • 2021-05-26
        • 2013-12-31
        • 2015-06-18
        • 2012-03-12
        • 2015-08-07
        • 2020-01-22
        相关资源
        最近更新 更多