2012-10-10 2 views
7

필자는 필자의 커맨드 라인 Ant 빌드의 일부로 FindBugs (2.0.1)를 실행하려고합니다. 아래FindBugs는 클래스 패스에서 bcel jar를 찾지 않습니다.

enter image description here

당신이 스크린 샷에서 볼 수 있듯이 : 나는 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에 복사하여 액세스 가능하게 만들었습니다 (Eclipse에 내장 된 Ant 인스턴스 대신) 명령 행에서 실행되는 Ant 버전으로 변경한다.

<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에 오류 얻을 :

/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 내부의

에게 다음과 같이

내 프로젝트 디렉토리 구조는

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 태스크를 찾을 수 없다는 불평을하면서 실패한 빌드를 얻게 될 것입니다. 온전한 검사로서, 나는 앞서 가서 (ANT_HOME/lib에서 findbugs-ant.jar을 삭제하고 실패한 빌드를 얻었습니다.) 이 빌드는 실패하지 않습니다 (성공합니다!). 그것은 findbugs를 실행하지 않습니다.

아무도 여기에서 무슨 일이 일어나고 있는지 알아볼 수 있습니까? 미리 감사드립니다!

+1

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

답변

0

재미 일은하지 bcel-1.0.jarbcel.jar 지정됩니다. 또한 Ant 스크립트에서 Findbugs를 실행하고 있습니다. 미친 듯이 들리면 Findbugs를 다시 다운로드하고 현재 위치에서 압축을 풀고 스크립트를 다시 실행하십시오.

1

내 생각 엔 실제로 클래스 경로에 BCEL이 두 번있는 것 같습니다. 그리고 파일이 FindBugs 라이브러리 외부의 jar에서로드됩니다. 그런 다음 FindBugs가 항아리를로드하려고 시도하면 FindBugs 라이브러리에있는 BCEL 에 있으며로드되어 있기 때문에로드 할 수 없습니다.

해결책은 클래스 경로에 BCEL이있는 곳을 찾아서 제거하는 것입니다.

+0

그건 좋은 제안 @Zagrev (+1) 나는거야 참조 여기에 몇 분 안에 시도해보십시오. 그냥 호기심에서, 당신이 이것을 어떻게 의심하게 만들었습니까? 나는 단지 1000 년 만에 그것을 생각하지 않았기 때문에 나는 묻는다. 그리고 그것은 이해된다! (나는이 JAR을 최근에 다른 곳으로 최근에 추가했다 ...) – IAmYourFaja

+0

끔찍한, 끔찍한 경험 :) – Zagrev

+0

글쎄, 시간이 좀 걸렸지 만, ANT_HOME/lib'과 FindBugs home에있는 모든 단일 JAR 파일을 살펴 보았다. 디렉토리이고,'bcel-1.0.jar'은 그 클래스를 포함하는 * 유일한 * JAR입니다. 다른 아이디어? 다시 한 번 감사드립니다! – IAmYourFaja

1

<javac> 작업이 클래스 파일을 컴파일 할 때 사용한 클래스 경로를 포함하도록 AuxClasspath를 정의해야 할 수 있습니다.

컴파일이 일어났다 방법 당신은 표시되지 않습니다, 그래서 당신 만든 compile.classapath 클래스 경로 참조를 가정입니다 :

BCEL은 -verbose 사용에서로드되는
<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

Thanks @ David W. (+1) - auxClasspath를 추가했지만 여전히 같은 오류가 발생합니다. 나는 자그레브가 복제 된 JAR 아이디어로 뭔가에 있었을지도 모른다고 느끼지만, 그것을 찾을 수 없을 것 같다. 궁금하네요. ANT_HOME/lib 디렉토리를 가리키고 그 디렉토리에있는 모든 JAR 내부의 모든 Java 클래스 목록을 인쇄 할 수있는 도구가 있습니까? 그렇게하면 중복 된 BCEL 클래스의 출력을 검색 할 수 있습니다. – IAmYourFaja

+0

@pnongrata _ 거기에 ANT_HOME/lib 디렉토리를 지정할 수있는 툴이 있으며, 그 디렉토리에있는 모든 JAR 내부의 모든 Java 클래스 목록을 출력 할 수 있습니까? "_ [Tattle Tale JBoss에서] (http://www.jboss.org/tattletale). –

3

당신은 디버깅 할 수 있습니다 : 클래스 인수를 jvm.

에 jvmargs

선택적 특성

플러그인 찾기 버그에에 jvmargs 플래그를 사용, findbugs를 실행하는 JVM에이 인수를 전달합니다. FindBugs를 실행하는 데 사용되는 Java 가상 시스템에 전달 된 이어야하는 모든 인수를 지정합니다. 매우 큰 프로그램을 분석 할 때 JVM이 사용할 수있는 메모리의 양을 늘리기 위해이 속성을 사용하여 플래그를 지정하려면 이 필요할 수 있습니다.

어떻게 버그 검색 lib jar를 채웠습니까? findbugs.zip을 다운로드하면 표시되는 것과 매우 다른 lib 디렉토리가 생깁니다. 특히, 광산은 당신이 보여 주듯이 1.0이 아닌 5.3 버전의 셀을 포함합니다.

+0

Thanks @ thebridges 나는 그것을 살펴보고, Ant 1.8.4를 사용하고 있습니다. – IAmYourFaja

+2

잘못된 bcel 버전이 있다고 생각합니다. findbugs 2.0.1.zip을 다운로드하면 포함 된 bcel은 5.0.3입니다. – sbridges

1

bsp가 findbugs 작업에서로드 할 수있는 모든 classpath에 Ant 스크립트가 표시되지 않습니다. 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> 
관련 문제