2012-10-10 23 views
7

पर बीएससी जार खोजने से इंकार कर देता है मेरे जीवन के लिए, मैं अपने कमांड लाइन एंट बिल्ड के हिस्से के रूप में चलाने के लिए FindBugs (2.0.1) प्राप्त करने का प्रयास कर रहा हूं। मैं FindBugs JAR डाउनलोड किया है और /home/myuser/java/repo/umd/findbugs/2.0.1/findbugs-2.0.1 करने के लिए इसे निकाले:FindBugs क्लासपाथ

enter image description here

आप स्क्रीनशॉट में देख सकते हैं, के तहत /home/myuser/java/repo/umd/findbugs/2.0.1/findbugs-2.0.1/lib 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 को इसे सुलभ बनाने के लिए कॉपी किया चींटी-रेखा से भागने वाली चींटी के संस्करण के लिए (एंटी उदाहरण के बजाय जो ग्रहण में आता है)।

/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 बिल्कुल libBugs घर के नीचे है, बस lib/निर्देशिका में हर दूसरे JAR की तरह।

कृपया ध्यान दें: findbugs-ant.jar निश्चित रूप से ANT_HOME/lib में कॉपी किया जाता है; अन्यथा मुझे एक असफल निर्माण मिल रहा होगा शिकायत है कि यह चींटी कार्यों को नहीं मिला। एक सैनिटी चेक के रूप में, मैंने आगे बढ़कर ऐसा किया (मैंने findbugs-ant.jar को ANT_HOME/lib से हटा दिया और एक असफल निर्माण मिला)। यह निर्माण विफल नहीं होता है (यह सफल होता है!)। यह सिर्फ findbugs नहीं चलाता है।

कोई भी यहां क्या हो रहा है यह पता लगा सकता है? अग्रिम में धन्यवाद!

+1

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

उत्तर

0

अजीब बात है क्योंकि मैं FindBugs के समान संस्करण और जार फ़ाइल का उपयोग कर रहा bcel.jar नहीं bcel-1.0.jar नाम पर है। मैं Ant स्क्रिप्ट से Findbugs भी चला रहा हूं। जैसा कि यह पागल हो सकता है उतना पागल हो, एक बार फिर Findbugs डाउनलोड करने का प्रयास करें, इसे अपने वर्तमान स्थान पर अनपैक करें और एक बार फिर अपनी स्क्रिप्ट चलाएं।

1

मेरा अनुमान है कि आप वास्तव में दो बार classpath में BCEL है। और फ़ाइल को FindBugs लाइब्रेरी के बाहर जार से लोड किया जा रहा है। तब, जब FindBugs जार लोड करने के लिए कोशिश करता है, यह BCEL में FindBugs पुस्तकालय पाता है और यह लोड नहीं कर सकता है, क्योंकि यह पहले से ही भरी हुई है।

समाधान और कहाँ BCEL classpath में मौजूद है और इसे दूर करने के लिए किया जाएगा।

+0

कि एक महान सुझाव @Zagrev (+1) मैं हूँ देखें इसे यहां कुछ मिनटों में आज़माएं। जिज्ञासा से बाहर, आपको इस मामले के बारे में क्या संदेह है? मैं केवल इसलिए पूछता हूं क्योंकि मैंने 1,000 वर्षों में इसका विचार नहीं किया होगा, और यह समझ में आता है! (मैंने हाल ही में इस जार को हाल ही में जोड़ा है ...) – IAmYourFaja

+0

भयानक, भयानक अनुभव :) – Zagrev

+0

ठीक है, इसमें थोड़ी देर लग गई, लेकिन मैं 'ANT_HOME/lib' के साथ-साथ मेरे FindBugs घर में प्रत्येक एकल JAR फ़ाइल के माध्यम से चला गया निर्देशिका, और वह 'बीसेल-1.0.jar' * उस * युक्त * केवल * जार है। कोई अन्य विचार ?? एक बार फिर धन्यवाद! – IAmYourFaja

1

आप classpath कि अपने <javac> कार्य में प्रयोग किया जाता है जब आपके वर्ग फ़ाइलों संकलन शामिल करने के लिए एक 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> 
+0

धन्यवाद @ डेविड डब्ल्यू (+1) - 'auxClasspath' और अभी भी वही त्रुटि जोड़ा गया। मुझे लगता है कि ज़ाग्रेव डुप्लिकेट जार विचार के साथ कुछ हो सकता है, लेकिन मुझे यह प्रतीत नहीं होता है। मैं सोच रहा हूं, क्या वहां कोई उपकरण है कि मैं अपनी ANT_HOME/lib निर्देशिका को इंगित कर सकता हूं, और क्या वह उस निर्देशिका में प्रत्येक JAR के अंदर प्रत्येक जावा क्लास की एक सूची मुद्रित कर सकता है? इस तरह मैं डुप्लिकेट बीसीईएल कक्षाओं के लिए आउटपुट स्कैन कर सकता था। – IAmYourFaja

+0

@pnongrata _ "वहाँ एक उपकरण है कि मैं अपनी ANT_HOME/lib निर्देशिका को इंगित कर सकता हूं, और क्या वह उस निर्देशिका में प्रत्येक JAR के अंदर प्रत्येक जावा क्लास की एक सूची मुद्रित कर सकता है?" _ [Tattle Tale] पर एक नज़र डालें जेबॉस से] (http://www.jboss.org/tattletale)। –

3

आप डीबग कर सकते हैं जहां BCEL -verbose का उपयोग करने से भरी हुई जा रही है: करने के लिए वर्ग तर्क जेवीएम

FindBugs चल JVM को यह तर्क पारित करने के लिए, प्लगइन

jvmargs

वैकल्पिक विशेषता ढूंढने के कीड़े पर jvmargs ध्वज का उपयोग करें। यह किसी भी तर्क को निर्दिष्ट करता है जो होना चाहिए जो वर्चबग चलाने के लिए उपयोग की जाने वाली जावा वर्चुअल मशीन पर पास हो। आपको की आवश्यकता हो सकती है ताकि मेमोरी की मात्रा बढ़ाने के लिए झंडे निर्दिष्ट करने के लिए इस विशेषता का उपयोग करने के लिए JVM का उपयोग किया जा सकता है यदि आप एक बहुत बड़े प्रोग्राम का विश्लेषण कर रहे हैं।

आपने खोज बग lib jar कैसे खोजा? जब मैं findbugs.zip डाउनलोड करता हूं, तो मुझे एक lib निर्देशिका मिलती है जो आपके द्वारा दिखाए गए कार्यों से बहुत अलग दिखती है। विशेष रूप से, मेरे पास 5.3 के संस्करण के साथ एक बीसीएल है, जैसा कि आप दिखाते हैं 1.0 नहीं।

+0

धन्यवाद @ एसब्रिजेस मैं इसे देख लूंगा - और मैं चींटी 1.8.4 – IAmYourFaja

+2

का उपयोग कर रहा हूं, मुझे लगता है कि आपके पास गलत बीएसएल संस्करण है। अगर मैं findbugs 2.0.1.zip डाउनलोड करता हूं, तो इसमें शामिल बीसेल 5.0.3 है – sbridges

1

मुझे आपकी चींटी स्क्रिप्ट से नहीं दिखाई देता है कि बीसीएल किसी भी क्लासपाथ पर लैंडिंग कर रहा है कि खोजबग कार्य इसे लोड करने में सक्षम होगा। हो सकता है कि आप अपने टास्कडेफ को स्पष्ट रूप से सबकुछ ढूंढने की कोशिश करना चाहें।

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

अधिकांश क्लासपाथ समस्याएं जिन्हें आप tattle से डिबग कर सकते हैं। यह आपको आपकी परियोजना में सभी जार की रिपोर्ट करेगा। सभी डुप्लिकेट कक्षाओं ने मुझे बहुत समय बचाया।

वहाँ भी चींटी तैयार काम है: http://docs.jboss.org/tattletale/userguide/1.2/en-US/html/ant.html

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^