7

私の人生の間、私は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にコピーして、次のバージョンにアクセスできるようにしました。 (Eclipseに組み込まれているAntインスタンスの代わりに)コマンドラインから実行される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は、lib /ディレクトリ内の他のすべてのJARと同様に、FindBugsホームの下にあります。

注意:これfindbugs-ant.jarは間違いなくANT_HOME/libにコピーされます。そうしないと、Antタスクが見つからないと文句を言ってビルドが失敗することになります。健全性チェックとして、先に進んでこれを実行しました(findbugs-ant.jarANT_HOME / libからを削除し、ビルドに失敗しました)。このビルドは失敗しません(成功します!)。findbugsを実行しないだけです。

誰かがここで何が起こっているのかを見つけることができますか?前もって感謝します!

4

6 に答える 6

3

jvmへの-verbose:class引数を使用して、BCELがロードされている場所をデバッグできます。

この引数をfindbugsを実行しているjvmに渡すには、findbugsプラグインでjvmargsフラグを使用します

jvmargs

オプションの属性。FindBugsの実行に使用されるJava仮想マシンに渡す必要のある引数を指定します。非常に大きなプログラムを分析している場合は、この属性を使用してフラグを指定し、JVMが使用できるメモリの量を増やす必要がある場合があります。

find bugs lib jarをどのように入力しましたか?findbugs.zipをダウンロードすると、表示されているものとは大きく異なるlibディレクトリが表示されます。特に、私のものには、あなたが示すように1.0ではなく5.3のバージョンのbcelが含まれています。

于 2012-10-14T01:09:23.007 に答える
1

私の推測では、実際にはクラスパスにBCELが2回あります。そして、ファイルはFindBugsライブラリの外のjarファイルからロードされています。次に、FindBugsがjarをロードしようとすると、FindBugsライブラリでBCELが検出され、すでにロードされているため、ロードできません。

解決策は、クラスパス内の他の場所にBCELが存在する場所を見つけて、それを削除することです。

于 2012-10-10T18:09:53.410 に答える
1

<javac>クラス ファイルのコンパイル時にタスクが使用したクラスパスを含めるために、AuxClasspath を定義する必要がある場合があります。

コンパイルがどのように行われたかを示していないため、compile.classapathクラスパス参照を作成したと想定しています。

<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>
于 2012-10-10T20:37:35.210 に答える
1

同じバージョンの Findbugs を使用していて、jar ファイルの名前がbcel.jarnotであるため、面白いことにbcel-1.0.jar. また、スクリプトから Findbugs を実行していAntます。クレイジーに聞こえるかもしれませんが、Findbugs をもう一度ダウンロードして、現在の場所で解凍し、スクリプトをもう一度実行してみてください。

于 2012-10-19T01:03:59.550 に答える
1

I don't see from your Ant script that bcel is landing on any classpath that the findbugs task would be able to load it from. You might want to try making your taskdef explicitly include everything findbugs needs.

<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>
于 2012-10-16T19:53:16.187 に答える
0

most classpath problems you can debug with tattle. it will report you all jars in your project. all duplicated classes etc. saved me a lot of time.

there is also ant task ready: http://docs.jboss.org/tattletale/userguide/1.2/en-US/html/ant.html

于 2012-10-20T10:18:09.393 に答える