ant - एन्टी का इस्तेमाल करते हुए सोनार में जैको को एकीकृत करना




sonarqube jacoco (2)

मैं जैकको को चींटी का उपयोग करके सोनार के साथ एकीकृत कर रहा हूं। इस कार्य के लिए बहुत नया है, और पहली बार एकीकृत करने के लिए मैं जैसे कई लिंक के माध्यम से चले गए हैं

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

यदि मेरा विवरण मेरे निशान तक नहीं है, तो कृपया पूछें

मदद के लिए धन्यवाद


Answers

निम्नलिखित एक एंटी बिल्ड है जो एक जूनिट यूनिट टेस्ट को चलाने के लिए कॉन्फ़िगर किया गया है और कोड कवरेज रिपोर्टिंग के लिए जैकोओ का उपयोग करता है। परिणाम सोनार पर अपलोड किए जाते हैं और अंत में आईवी का उपयोग 3 पार्टी जार डाउनलोड करने और कक्षापथों का प्रबंधन करने के लिए किया जाता है।

उदाहरण

├── build.properties
├── build.xml
├── ivy.xml
└── src
    ├── main
    │   └── java
    │       └── org
    │           └── demo
    │               └── App.java
    └── test
        └── java
            └── org
                └── demo
                    └── AppTest.java

build.properties

# Build properties
build.dir=build

src.dir=src/main/java
test.src.dir=src/test/java

classes.dir=${build.dir}/classes
test.classes.dir=${build.dir}/test-classes

reports.dir=${build.dir}/reports

# Sonar properties
sonar.projectKey=org.demo:demo
sonar.projectName=Demo project
sonar.projectVersion=1.0
sonar.projectDescription=This is my demo Sonar project

sonar.host.url=http://localhost:9000

sonar.jdbc.url=jdbc:h2:tcp://localhost:9092/sonar
sonar.jdbc.driverClassName=org.h2.Driver
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar

sonar.working.directory=${build.dir}/sonar

sonar.language=java
sonar.sources=${src.dir}
sonar.binaries=${classes.dir}
sonar.tests=${test.src.dir}

sonar.dynamicAnalysis=reuseReports
sonar.surefire.reportsPath=${reports.dir}/junit
sonar.java.coveragePlugin=jacoco
sonar.jacoco.reportPath=${build.dir}/jacoco.exec

build.xml

<project name="demo" default="test" xmlns:ivy="antlib:org.apache.ivy.ant">

    <property file="build.properties"/>

    <target name="bootstrap" description="Install ivy">
        <mkdir dir="${user.home}/.ant/lib"/>
        <get dest="${user.home}/.ant/lib/ivy.jar" src="http://search.maven.org/remotecontent?filepath=org/apache/ivy/ivy/2.3.0/ivy-2.3.0.jar"/>
    </target>

    <target name="resolve" description="Download dependencies and setup classpaths">
        <ivy:resolve/>
        <ivy:report todir='${reports.dir}/ivy' graph='false' xml='false'/>

        <ivy:cachepath pathid="compile.path" conf="compile"/>
        <ivy:cachepath pathid="test.path"    conf="test"/>
        <ivy:cachepath pathid="build.path"   conf="build"/>
    </target>

    <target name="init" depends="resolve" description="Create build directories">
        <mkdir dir="${classes.dir}"/>
        <mkdir dir="${test.classes.dir}"/>
        <mkdir dir="${reports.dir}/junit"/>
    </target>

    <target name="compile" depends="init" description="Compile source code">
        <javac srcdir="${src.dir}" destdir="${classes.dir}" includeantruntime="false" debug="true" classpathref="compile.path"/>
    </target>

    <target name="compile-tests" depends="compile" description="Compile test source code">
        <javac srcdir="${test.src.dir}" destdir="${test.classes.dir}" includeantruntime="false" debug="true">
            <classpath>
                <path refid="test.path"/>
                <pathelement path="${classes.dir}"/>
            </classpath>
        </javac>
    </target>

    <target name="test" depends="compile-tests" description="Run unit tests and code coverage reporting">
        <taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml" classpathref="build.path"/>

        <jacoco:coverage destfile="${build.dir}/jacoco.exec" xmlns:jacoco="antlib:org.jacoco.ant">
            <junit haltonfailure="yes" fork="true">
                <classpath>
                    <path refid="test.path"/>
                    <pathelement path="${classes.dir}"/>
                    <pathelement path="${test.classes.dir}"/>
                </classpath>
                <formatter type="plain" usefile="false" />
                <formatter type="xml"/>
                <batchtest fork="yes" todir="${reports.dir}/junit">
                    <fileset dir="${test.src.dir}">
                        <include name="**/*Test*.java"/>
                        <exclude name="**/AllTests.java"/>
                    </fileset>
                </batchtest>
            </junit>
        </jacoco:coverage>
    </target>

    <target name="sonar" depends="test" description="Upload metrics to Sonar">
        <taskdef uri="antlib:org.sonar.ant" resource="org/sonar/ant/antlib.xml" classpathref="build.path"/>

        <ivy:cachepath pathid="sonar.libraries" conf="compile"/> 

        <sonar:sonar xmlns:sonar="antlib:org.sonar.ant"/>
    </target>

    <target name="clean" description="Cleanup build files">
        <delete dir="${build.dir}"/>
    </target>

    <target name="clean-all" depends="clean" description="Additionally purge ivy cache">
        <ivy:cleancache/>
    </target>

</project>

ivy.xml

<ivy-module version="2.0">
    <info organisation="com.myspotontheweb" module="demo"/>

    <configurations defaultconfmapping="compile->default">
        <conf name="compile" description="Required to compile application"/>
        <conf name="test"    description="Required for test only" extends="compile"/>
        <conf name="build"   description="Build dependencies"/>
    </configurations>

    <dependencies>
        <!-- compile dependencies -->

        <!-- test dependencies -->
        <dependency org="junit" name="junit" rev="4.10" conf="test->default"/>

        <!-- build dependencies -->
        <dependency org="org.codehaus.sonar-plugins" name="sonar-ant-task" rev="2.1" conf="build->default"/>
        <dependency org="org.jacoco" name="org.jacoco.ant" rev="0.6.3.201306030806" conf="build->default"/>

        <!-- Global exclusions -->
        <exclude org="org.apache.ant"/>
    </dependencies>

</ivy-module>

आप प्रोफाइल के साथ ऐसा कर सकते हैं ...

यदि आप वास्तव में दो अलग-अलग प्रोफाइल का उपयोग करना चाहते हैं और कक्षा और पैकेज नामों के पैटर्न को शामिल और बहिष्कृत करने के लिए जेएआर प्लगइन को कस्टमाइज़ करना चाहते हैं, तो आप इसे आसानी से अपने पीओएम में कुछ डालकर कर सकते हैं:

<profiles>
  <profile>
    <id>everything</id>
    <build>
      <plugins>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <configuration>
            <classifier>everything</classifier>
            <includes>
              <include>**/*</include>
            </includes>
          </configuration>
        </plugin>
      </plugins>
    </build>
  </profile>
  <profile>
    <id>only-library</id>
    <build>
      <plugins>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <configuration>
            <classifier>only-library</classifier>
            <excludes>
              <exclude>**/Main*</exclude>
            </excludes>
          </configuration>
        </plugin>
      </plugins>
    </build>
  </profile>
</profiles>

इसके अलावा: यदि यह बहुत सारी कॉन्फ़िगरेशन की तरह लगता है, तो ग्रोवी पीओएम के लिए पॉलीग्लोट मेवेन का समर्थन बस तैयार है। यह लाइन गिनती में काफी कटौती करेगा।

आप इसे अपने pom.xml (प्रोजेक्ट तत्व के साथ) के अंत में रखेंगे, और यह दो प्रोफाइल जोड़ता है। कॉन्फ़िगरेशन का प्रदर्शन करने के लिए पहली प्रोफ़ाइल "सबकुछ" वास्तव में है। यह "सबकुछ" प्रोफ़ाइल अनावश्यक है क्योंकि यह डिफ़ॉल्ट जेएआर प्लगइन जार लक्ष्य निष्पादन के व्यवहार को केवल डुप्लिकेट करता है। दूसरी प्रोफ़ाइल "केवल-लाइब्रेरी" किसी भी पैकेज में किसी भी वर्ग को शामिल करती है जो पाठ "मुख्य" से शुरू होती है। इन प्रोफाइलों का आह्वान करने के लिए:

mvn package -Peverything
mvn package -Ponly-library

मैंने नमूना आवेदन के खिलाफ इसका परीक्षण किया जो कि उदाहरण के द्वारा मेवेन के अध्याय 6 के साथ जहाजों को चलाता है, और इन आदेशों में से किसी एक को चलाने से एक जेएआर फ़ाइल $ {basedir} / लक्ष्य में क्लासिफायरफायर होगी। चूंकि जेएआर प्लगइन का जार लक्ष्य डिफ़ॉल्ट मैवेन लाइफसाइकिल में पैकेज चरण से जुड़ा हुआ है, इसलिए ये दो प्रोफाइल इस प्लगइन के लिए कॉन्फ़िगरेशन को संशोधित करने जा रहे हैं।

या, आप इसे दो जार प्लगइन निष्पादन के साथ कर सकते हैं ...

यदि आपको प्रोफ़ाइल का उपयोग किए बिना दो जार बनाने की आवश्यकता है। आप जेएआर प्लगइन के जार लक्ष्य को पैकेज लाइफसाइकिल चरण में कई बार बाध्य कर सकते हैं और प्रत्येक कॉन्फ़िगर किए गए निष्पादन के लिए अलग-अलग कॉन्फ़िगरेशन का उपयोग कर सकते हैं। यदि आप दो अलग-अलग निष्पादन को कॉन्फ़िगर करते हैं, तो प्रत्येक निष्पादन में निष्पादन-विशिष्ट कॉन्फ़िगरेशन ब्लॉक होता है ताकि आप एक अद्वितीय पहचानकर्ता की आपूर्ति कर सकें और प्रत्येक निष्पादन के लिए पैटर्न को शामिल / बहिष्कृत कर सकें।

यहां बिल्ड तत्व है जिसका उपयोग आप कस्टम जैर्स को जीवन चक्र चरण "पैकेज" में जोड़ने के लिए करेंगे। पैकेजिंग "जार" के साथ एक परियोजना पर ऐसा करने के परिणामस्वरूप जार लक्ष्य तीन बार चल रहा है। एक बार डिफ़ॉल्ट जीवन चक्र बाध्यकारी के रूप में, और फिर दो कस्टम, वर्गीकृत JARs के लिए दो बार।

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <executions>
          <execution>
            <id>only-library</id>
            <goals><goal>jar</goal></goals>
            <phase>package</phase>
            <configuration>
              <classifier>only-library</classifier>
              <excludes>
                <exclude>**/Main*</exclude>
              </excludes>
            </configuration>
          </execution>
          <execution>
            <id>everything</id>
            <goals><goal>jar</goal></goals>
            <phase>package</phase>
            <configuration>
              <classifier>everything</classifier>
              <includes>
                <include>**/*</include>
              </includes>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

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

अस्वीकरण: (कृपया) ऐसा मत करो। यदि आप कक्षाओं के दो अलग-अलग सेट के साथ दो अंतर जेएआर बना रहे हैं, तो मैं दृढ़ता से अनुशंसा करता हूं कि आप परियोजना को दो परस्पर निर्भर मॉड्यूल में विभाजित करें।

जबकि आप प्रोफाइल के साथ ऐसा कर सकते हैं, प्रोजेक्ट को दो (वास्तव में तीन) में विभाजित करना आपके लिए आसान होगा। लंबे समय तक ऐसी चुनौतियां हो रही हैं जिन्हें आप अपने आवेदन के पैमाने के रूप में सामना करने जा रहे हैं। कक्षाओं और पैकेजों की इस मैन्युअल सूची को आपके प्रत्येक वर्गीकृत जेएआर में शामिल करने के लिए आप जिम्मेदार होंगे।

एक साधारण पेरेंट प्रोजेक्ट होने के लिए न्यूनतम ओवरहेड है जो दो अलग मॉड्यूल का संदर्भ देता है। यदि आप उदाहरण पुस्तक द्वारा मुफ्त मेवेन को देखते हैं, तो हम दिखाते हैं कि एकल-मॉड्यूल और बहु-मॉड्यूल प्रोजेक्ट के बीच संक्रमण कैसे करें। अध्याय 3-5 एकल मॉड्यूल परियोजनाओं पर ध्यान केंद्रित करता है, और अध्याय 6 आपको दिखाता है कि आप इन एकल मॉड्यूल घटकों को एक बड़े बहु-मॉड्यूल प्रोजेक्ट में कैसे जोड़ेंगे।

अधिक जानकारी के लिए:

आपके प्रश्न में निम्नलिखित विषय शामिल हैं, यहां कुछ लिंक दिए गए हैं जो प्रत्येक के लिए अधिक जानकारी प्रदान करेंगे:

मेवेन जेएआर प्लगइन: http://maven.apache.org/plugins/maven-jar-plugin/jar-mojo.html

मल्टी-मॉड्यूल मेवेन प्रोजेक्ट्स: उदाहरण के अनुसार मेवेन का अध्याय 6 और मेवेन की धारा 3.6.2: पूर्ण संदर्भ

मेवेन लाइफसाइक्ल (यदि आपका पैकगिन "जार" है तो जार पैकेज करने के लिए बाध्य है): उदाहरण के द्वारा मेवेन की धारा 3.5.2 "कोर कॉन्सेप्ट्स" और मेवेन के अध्याय 4: पूर्ण संदर्भ

मेवेन असेंबली: सबसे पहले, मेवेन असेंबली प्लगइन साइट , फिर मेवेन का अध्याय 8: कुछ भारी (लगभग भारी) विवरणों के लिए पूर्ण संदर्भ