2012-04-18 19 views
7

यदि मेरे पास एक जावा प्रोजेक्ट है जो लाइब्रेरी (एक जार फ़ाइल) का उपयोग करता है, तो क्या इस जार के अंदर कक्षाओं के कोड कवरेज को प्राप्त करना संभव है?मैं जैकोको के साथ बाहरी जावा पुस्तकालय का कोड कवरेज कैसे प्राप्त कर सकता हूं?

इस के पीछे विचार यह है कि मैं यह जानना चाहता हूं कि परियोजना के बाहरी पुस्तकालयों का अनुपात किस प्रकार निर्भर करता है (चलो वसंत, हाइबरनेट, या स्कैला जार हो सकता है यदि यह एक स्कैला प्रोजेक्ट था, क्यों नहीं) वास्तव में उपयोग किया जाता है। मैं यह भी कल्पना करता हूं कि मैं उन्हें सूचीबद्ध करने की कोशिश कर सकता हूं और उन्हें एक ही जार में दोबारा जोड़ सकता हूं जिसमें केवल आवश्यक होगा। क्लास फाइलें (उदाहरण के लिए अपाचे फ़ेलिक्स जैसी प्लगइन के साथ), सबसे छोटा संभव जार प्राप्त करने के लिए। मुझे यकीन नहीं है कि मैं वास्तव में ऐसा करना चाहता हूं, मुझे पता है कि यह कई कारणों से शायद एक बुरा विचार है, लेकिन मैं इसे एक प्रयोग के रूप में सोचता हूं।

मुझे यह नहीं पता कि यह कैसे करना है, जैकोको केवल मेरी परियोजना के अंदर कक्षा फ़ाइलों के लिए कवरेज की रिपोर्ट करता है। शायद मैं कुछ गलत कर रहा हूँ, मैं इस तरह Maven प्लगइन का उपयोग कर रहा:

 <plugin> 
      <groupId>org.jacoco</groupId> 
      <artifactId>jacoco-maven-plugin</artifactId> 
      <version>0.5.6.2012</version> 
      <configuration> 
       <destfile>${basedir}/target/coverage-reports/jacoco-unit.exec</destfile> 
       <datafile>${basedir}/target/coverage-reports/jacoco-unit.exec</datafile> 
       <includes> 
        <include>**</include> 
       </includes> 
      </configuration> 
      <executions> 
       <execution> 
        <id>jacoco-initialize</id> 
        <goals> 
         <goal>prepare-agent</goal> 
        </goals> 
       </execution> 
       <execution> 
        <id>jacoco-site</id> 
        <phase>package</phase> 
        <goals> 
         <goal>report</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 

मैं बदल रहा टैग शामिल की कोशिश की है, लेकिन केवल प्रभाव डिफ़ॉल्ट है जो सिर्फ क्लास फ़ाइलों को सीधे अंदर शामिल सीमित है मेरी परियोजना।

अग्रिम धन्यवाद!


oers 'जवाब के बाद संपादित करें:

मुझे पता चला कैसे चींटी और antrun-प्लगइन के साथ यह करने के लिए है, हालांकि यह बहुत जटिल है, मैं antrun प्लगइन संस्करण (एक करने में असमर्थ के साथ ज्यादा मुसीबत था हालिया संस्करण का काम, यहां तक ​​कि एक बुनियादी कार्य के लिए) और मैं वास्तव में मेवेन से चिपकना चाहता हूं। यदि कोई जानता है कि चींटी के बजाय जे जैकोको मेवेन प्लगइन के बराबर कैसे करना है, तो मुझे रूचि है!

चींटी के साथ आंशिक समाधान: वास्तव में jacoco.exec फ़ाइल में पहले से ही मेरे बाहरी जारों के वर्गों के संदर्भ शामिल हैं; इसलिए यह रिपोर्ट कार्य है जिसे इन जार का विवरण लेने के लिए कहा जाना चाहिए, न कि रनटाइम चरण जैसा कि मैंने सोचा था। यहाँ Maven विन्यास मैं इस्तेमाल किया (मैं http://intellectualcramps.wordpress.com/2012/03/22/jacoco-tycho-and-coverage-reports/ पर मदद पाया जाता है) है:

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-antrun-plugin</artifactId> 
      <!--<version>1.7</version>--> 
      <dependencies> 
       <dependency> 
        <groupId>org.jacoco</groupId> 
        <artifactId>org.jacoco.ant</artifactId> 
        <version>0.5.6.2012</version> 
       </dependency> 
       <dependency> 
        <groupId>ant-contrib</groupId> 
        <artifactId>ant-contrib</artifactId> 
        <version>20020829</version> 
       </dependency> 
      </dependencies> 
      <executions> 
       <execution> 
        <id>jacoco-report</id> 
        <phase>package</phase> 
        <goals> 
         <goal>run</goal> 
        </goals> 
        <configuration> 
         <tasks> 

          <taskdef name="jacoco-report" 
            classname="org.jacoco.ant.ReportTask" 
            classpathref="maven.plugin.classpath" /> 
          <taskdef classpathref="maven.runtime.classpath" 
        resource="net/sf/antcontrib/antcontrib.properties" /> 
          <available 
       file="${project.basedir}/target/jacoco.exec" 
       property="jacoco.exec.file.exists" /> 
          <echo message="${project.basedir}/target/jacoco.exec" /> 
          <if> 
           <equals arg1="${jacoco.exec.file.exists}" 
         arg2="true" /> 
           <then> 
            <echo message="Executing jacoco report" /> 

            <trycatch> 
             <try> 
              <jacoco-report> 
               <executiondata> 
                <file 
           file="${project.basedir}/target/jacoco.exec" /> 
               </executiondata> 

               <structure name="Minerva"> 
                <classfiles> 
                 <fileset 
            dir="target/classes" /> 

                 <fileset dir="C:/Data/dev/m2Repository/com/groupama/framework/crypt/fwk-cryptage/1.0/"> 
                  <include name="**/*.jar"/> 
                 </fileset> 

                </classfiles> 

                <sourcefiles 
            encoding="UTF-8"> 
                 <fileset 
            dir="src/main/java" /> 
                </sourcefiles> 
               </structure> 
               <html destdir="${project.basedir}/target/jacoco/report" /> 
               <xml destfile="${project.basedir}/target/jacoco/report/jacoco.xml"/> 
              </jacoco-report> 
             </try> 
             <catch> 
              <echo>skipping</echo> 
             </catch> 
            </trycatch> 
           </then> 
           <else> 
            <echo message="No jacoco.exec file found." /> 
           </else> 
          </if> 
         </tasks> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 

उत्तर

1

आप रिपोर्ट के लक्ष्य पुस्तकालय विश्लेषण करना चाहते हैं की कक्षाएं देने के लिए की जरूरत है। दुर्भाग्य से मुझे उस पर एक दस्तावेज नहीं मिल रहा है। The official docu is ... hm ... sparse

यदि आप चींटी निष्पादित कर सकते हैं, तो मैं report task को देखने का सुझाव दूंगा।

<jacoco:report> 

    <executiondata> 
     <file file="jacoco.exec"/> 
    </executiondata> 

    <structure name="Example Project"> 
     <classfiles> 
      <fileset dir="classes"/> <!-- HERE THE CLASSES FROM YOUR LIB --> 
     </classfiles> 
     <sourcefiles encoding="UTF-8"> 
      <fileset dir="src"/> <!-- HERE THE SORUCESFROM YOUR LIB --> 
     </sourcefiles> 
    </structure> 

    <html destdir="report"/> 

</jacoco:report> 
+0

आप दस्तावेज़ीकरण के बारे में सही हैं, जो वास्तव में और अधिक पूर्ण होने की आवश्यकता है। मैंने वास्तव में सोचा कि यह रन कार्य था जिसे पैरामीटर किया जाना आवश्यक था; आपने मुझे jacoco.exec फ़ाइल में देखा है और महसूस किया है कि इसमें पहले से ही बाहरी जार के अंदर कक्षाओं के संदर्भ शामिल हैं, जिसका अर्थ है कि यह वह रिपोर्ट है जिसे सही ढंग से पैरामीटर किया जाना चाहिए। चींटी को नहीं जानते, मैंने इसे काम करने से पहले पूरी सुबह बिताया, लेकिन आखिर में काम किया।यह आंशिक रूप से मुझे संतुष्ट करता है, नीचे मेरा जवाब देखें, लेकिन यह सही दिशा में एक कदम है। वैसे भी बहुत बहुत धन्यवाद! – Guillaume

+0

धन्यवाद ओरेस आपने अपना दिन बचाया – vinod

0

हालांकि यह प्रश्न पुराना है, फिर भी यह प्रासंगिक लगता है। बाहरी पुस्तकालय एक Maven परियोजना है, तो आप पुस्तकालय स्रोत निर्देशिका जाता हूं और वहां के भीतर से अपने testsuite साथ पहले से प्राप्त JaCoCo रिपोर्ट का अनुरोध कर सकते हैं:

mvn org.jacoco:jacoco-maven-plugin:0.7.8:report -Djacoco.dataFile=/path/to/jacoco.exec 

आप $ {परियोजना}/लक्ष्य/साइट में रिपोर्ट प्राप्त/जैकोको निर्देशिका।