2012-10-10 19 views
7

私の人生にとって、私はFindBugs(2.0.1)をコマンドラインのAntビルドの一部として実行しようとしています。私はFindBugsのJARをダウンロードして/home/myuser/java/repo/umd/findbugs/2.0.1/findbugs-2.0.1にそれを抽出:FindBugsはクラスパスでbcel jarを見つけることを拒否します

enter image description here

あなたは下のスクリーンショットで見ることができるように/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にコピーしてアクセス可能にしました(Eclipseに組み込まれているAntインスタンスの代わりに)コマンドラインから実行されるAntのバージョンに変更します。

次のように私のプロジェクトのディレクトリ構造は次のとおりです。

build.xmlインサイド
/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/ 

<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.jarをANT_HOME/libから削除してビルドに失敗しました)。このビルドは失敗しません(成功しました!)。それはfindbugsを実行しません。

ここでは何が起こっているのか誰にも気付くことができますか?前もって感謝します!

+1

は素晴らしい提案@Zagrev(1)I'LLだhttp://stackoverflow.com/questions/12744819/findbugs-issue-with-ant/ –

答えて

0

おかしい事はないbcel-1.0.jarbcel.jar命名されます。また、AntスクリプトからFindbugsを実行しています。奇妙に聞こえるかもしれませんが、Findbugsをもう一度ダウンロードし、現在の場所に解凍してもう一度スクリプトを実行してみてください。

1

実際には、クラスパスにBCELが2回あると思います。そしてファイルはFindBugsライブラリの外にあるjarからロードされています。次に、FindBugsがjarをロードしようとすると、FindBugsライブラリのにあるBCEL が見つかって読み込みができません。ロードされているためです。

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

+0

を参照してください。ここに数分で試してみてください。好奇心の外に、あなたはこれが事実であると思わせたのですか?私は1000年の間にそれを考えなかったので、私は尋ねるだけで意味があります! (私は最近、このJARを最近別の場所に追加しました...) – IAmYourFaja

+0

恐ろしい、恐ろしい経験:) – Zagrev

+0

まあ、それには時間がかかりましたが、ANT_HOME/lib'の下のすべてのJARファイルとFindBugsホーム'bcel-1.0.jar'はそのクラスを含む* only * JARです。他のアイデアは?再度、感謝します! – IAmYourFaja

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> 
+0

ありがとう@David W.(+1) - auxClasspathを追加しましたが、それと同じエラーです。 Zagrevが重複したJARのアイデアで何かをしていたような気がしますが、見つけられないようです。私は、ANT_HOME/libディレクトリを指し示すことができ、そこにあるすべてのJARの内部にあるすべてのJavaクラスのリストを出力するツールがあるのだろうかと疑問に思っていますか?そうすれば、重複したBCELクラスの出力をスキャンすることができます。 – IAmYourFaja

+0

@pnongrata _そこに私のANT_HOME/libディレクトリを指し示すことができるツールがあり、そのディレクトリにあるすべてのJARの中にあるすべてのJavaクラスのリストをプリントアウトさせることができますか? "_ [Tattle Tale JBossから](http://www.jboss.org/tattletale)。 –

3

BCELは、-verboseを使用してからロードされている場所あなたがデバッグすることができます:クラス引数jvm。

JVMARGS

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

どのようにしてfind bugs lib jarを作成しましたか? findbugs.zipをダウンロードすると、表示するものとは非常に異なるlibディレクトリが作成されます。特に、鉱山には、あなたが示すように、バージョン5.3のバーセルが含まれています。

+0

ありがとう@sbridges私はそれをチェックします - そして、私はAnt 1.8.4を使用しています。 – IAmYourFaja

+2

私はあなたが誤ったbcelバージョンを持っていると思います。 findbugs 2.0.1.zipをダウンロードした場合、それに含まれるbcelは5.0.3です – sbridges

1

私はあなたのAntスクリプトから、bcelがfindbugsタスクがそれをロードできるクラスパスに上っているとは見ません。あなたのtaskdefに、findbugsの必要性をすべて明示的に含めるようにしてみてください。私はFindBugsの同じバージョンとjarファイルを使用していますので、

<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> 
関連する問題