Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java FindBugs拒绝在类路径上找到bcel jar_Java_Ant_Findbugs - Fatal编程技术网

Java FindBugs拒绝在类路径上找到bcel jar

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

就我个人而言,我正试图让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,如果您打开它,您可以看到我已经深入到了一个名为
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>
以下是令我惊讶的事情:

  • 即使使用
    failOnError=“true”
    ,FindBugs也不会停止生成,即使遇到此运行时异常
  • 最后一段输出“
    保存到gen/audits/qual/findbugs.html的输出”是个谎言!
    gen/audits/qual
    中没有任何内容
  • bcel-1.0.jar
    绝对位于FindBugs home下,就像lib/目录中的其他jar一样
请注意:findbugs ant.jar肯定会复制到ant_HOME/lib;否则,我将得到一个失败的构建,抱怨它找不到Ant任务。作为一个合理性检查,我继续这样做(我从ant_HOME/lib中删除了
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>