2012-10-10 27 views
7

Đối với cuộc sống của tôi, tôi đang cố gắng để có được FindBugs (2.0.1) để chạy như một phần của xây dựng dòng lệnh Ant của tôi. Tôi đã tải về JAR FindBugs và trích xuất nó để /home/myuser/java/repo/umd/findbugs/2.0.1/findbugs-2.0.1:FindBugs từ chối tìm bcel jar trên classpath

enter image description here

Như bạn có thể thấy trong hình bên dưới /home/myuser/java/repo/umd/findbugs/2.0.1/findbugs-2.0.1/lib có một JAR gọi là bcel-1.0.jar, và nếu bạn mở nó, bạn có thể thấy rằng tôi đã khoan xuống một lớp gọi là org.apache.bcel.classfile.ClassFormatException . Giữ suy nghĩ đó đi.

Sau đó, tôi đã sao chép /home/myuser/java/repo/umd/findbugs/2.0.1/findbugs-2.0.1/lib/findbugs-ant.jar thành $ {env.ANT_HOME}/lib để có thể truy cập với phiên bản Ant được chạy từ dòng lệnh (thay vì cá thể Ant được tích hợp sẵn trong Eclipse).

cấu trúc thư mục dự án của tôi là như sau:

/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/ 

Bên 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> 

Nhưng khi tôi chạy ant -buildfile build.xml echoMsg từ dòng lệnh, tôi nhận được một lỗi trong 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!!! 

Đây là những gì tôi có ngạc nhiên:

  • Ngay cả với failOnError="true", FindBugs không ngăn chặn việc xây dựng ngay cả khi ngoại lệ runtime này là gặp phải
  • Các mảnh cuối cùng của đầu ra "Output saved to gen/audits/qual/findbugs.html" là một lời nói dối! Có không có gì trong gen/audits/qual!
  • bcel-1.0.jar hoàn toàn nằm dưới FindBugs, giống như mọi JAR khác trong thư mục lib /.

Xin lưu ý: findbugs-ant.jar chắc chắn được sao chép sang ANT_HOME/lib; nếu không tôi sẽ nhận được một xây dựng không thành công phàn nàn rằng nó không thể tìm thấy các nhiệm vụ Ant. Như một kiểm tra sanity, tôi đã đi trước và đã làm điều này (tôi đã xóa findbugs-ant.jar từ ANT_HOME/lib và đã xây dựng không thành công). Bản dựng này không thành công (nó thành công!). Nó chỉ không chạy findbugs.

Có ai có thể phát hiện những gì đang xảy ra ở đây không? Cảm ơn trước!

+1

Xem http://stackoverflow.com/questions/12744819/findbugs-issue-with-ant/ –

Trả lời

0

Funny điều vì tôi đang sử dụng cùng một phiên bản của FindBugs và file jar được đặt tên bcel.jar không bcel-1.0.jar. Tôi cũng đang chạy Findbugs từ tập lệnh Ant. Nghe có vẻ điên rồ, hãy thử tải xuống Findbugs một lần nữa, giải nén nó ở vị trí hiện tại của bạn và chạy kịch bản của bạn một lần nữa.

1

Đoán của tôi là bạn thực sự có BCEL trong đường dẫn lớp hai lần. Và tệp đang được tải từ jar bên ngoài thư viện FindBugs. Sau đó, khi FindBugs cố tải bình, nó tìm thấy BCEL trong thư viện FindBugs và không thể tải nó vì nó đã được tải.

Giải pháp sẽ là tìm nơi khác BCEL tồn tại trong đường dẫn lớp và xóa nó.

+0

Đó là một gợi ý tuyệt vời @Zagrev (1) Tôi sẽ hãy thử một vài phút ở đây. Chỉ vì tò mò, điều gì làm bạn nghi ngờ đây là trường hợp? Tôi chỉ hỏi vì tôi sẽ không nghĩ về nó trong 1.000 năm, và nó có ý nghĩa! (Tôi chắc chắn đã thêm JAR này ở nơi khác gần đây ...) – IAmYourFaja

+0

kinh khủng, kinh khủng khủng khiếp :) – Zagrev

+0

Vâng, phải mất một thời gian, nhưng tôi đã đi qua tất cả các file JAR duy nhất dưới 'ANT_HOME/lib' cũng như trong nhà FindBugs của tôi thư mục, và rằng 'bcel-1.0.jar' là * chỉ * JAR chứa lớp đó. Bất kỳ ý tưởng khác ?? Cảm ơn một lần nữa! – IAmYourFaja

1

Bạn có thể phải xác định AuxClasspath để bao gồm đường dẫn lớp mà tác vụ <javac> của bạn được sử dụng khi biên dịch các tệp lớp học của bạn.

Bạn không hiển thị như thế nào biên dịch đã diễn ra, vì vậy tôi giả định tạo ra một tài liệu tham khảo compile.classapath classpath của bạn:

<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

Cảm ơn @David W. (+1) - đã thêm 'auxClasspath' và vẫn là lỗi tương tự. Tôi thực sự cảm thấy như Zagrev có thể đã được vào một cái gì đó với ý tưởng JAR trùng lặp, nhưng tôi dường như không thể tìm thấy nó. Tôi đang tự hỏi, có một công cụ ra khỏi đó mà tôi có thể điểm thư mục ANT_HOME/lib của tôi, và có nó in ra một danh sách của mọi lớp Java bên trong của mỗi JAR trong thư mục đó? Bằng cách đó tôi có thể quét đầu ra cho các lớp BCEL trùng lặp. – IAmYourFaja

+0

@pnongrata _ "có một công cụ nào đó ở đó mà tôi có thể trỏ thư mục ANT_HOME/lib của tôi đến, và nó in ra một danh sách của mọi lớp Java bên trong mỗi JAR trong thư mục đó?" _ Hãy xem [Tattle Tale từ JBoss] (http://www.jboss.org/tattletale). –

3

Bạn có thể gỡ lỗi nơi BCEL đã được nạp từ việc sử dụng -verbose: đối số lớp jvm.

Để vượt qua lập luận này để JVM chạy FindBugs, sử dụng jvmargs cờ trên tìm lỗi cắm

jvmargs

thuộc tính bắt buộc. Nó chỉ định bất kỳ đối số nào cần được truyền cho máy ảo Java được sử dụng để chạy FindBugs. Bạn có thể cần để sử dụng thuộc tính này để chỉ định cờ để tăng số lượng bộ nhớ mà JVM có thể sử dụng nếu bạn đang phân tích một chương trình rất lớn.

Làm cách nào bạn điền vào các lỗi tìm lỗi lib? Khi tôi tải về findbugs.zip, tôi nhận được một thư mục lib trông rất khác so với những gì bạn hiển thị. Đặc biệt, tôi chứa một bcel với phiên bản 5.3, không phải 1.0 khi bạn hiển thị.

+0

Cảm ơn @sbridges Tôi sẽ kiểm tra xem nó ra - và tôi đang sử dụng Ant 1.8.4 – IAmYourFaja

+2

Tôi nghĩ rằng bạn có phiên bản bcel sai. Nếu tôi tải về findbugs 2.0.1.zip, bcel nó bao gồm là 5.0.3 – sbridges

1

Tôi không thấy từ tập lệnh Ant của bạn mà bcel đang hạ cánh trên bất kỳ classpath nào mà tác vụ tìm kiếm sẽ có thể tải nó. Bạn có thể muốn thử làm nhiệm vụ của bạn rõ ràng bao gồm tất cả mọi thứ cần tìm.

<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> 
Các vấn đề liên quan