TheNEXUS

1.7. Mavenin ja Antin vertailu

Tämän kirjan kirjoittajilla ei ole kiinnostusta luoda riitaa Apache Antin ja Apache Mavenin välille, mutta olemme myös tietoisia siitä, että useimmat organisaatiot joutuvat tekemään päätöksen näiden kahden standardiratkaisun välillä: Apache Ant ja Apache Maven. Tässä osiossa vertailemme ja asetamme työkalut vastakkain.

Ant on erinomainen rakentamisprosessissa, se on makin mallin mukainen rakentamisjärjestelmä, jossa on kohteita ja riippuvuuksia. Jokainen kohde koostuu joukosta ohjeita, jotka on koodattu XML-muodossa. On copy tehtävä ja javac tehtävä sekä jar tehtävä. Kun käytät Antia, annat Antille erityiset ohjeet tulostesi kääntämistä ja pakkaamista varten. Katso seuraava esimerkki yksinkertaisesta build.xml-tiedostosta:

A Simple Ant build.xml-tiedosto.

<project name="my-project" default="dist" basedir="."> <description> simple example build file </description> <!-- set global properties for this build --> <property name="src" location="src/main/java"/> <property name="build" location="target/classes"/> <property name="dist" location="target"/> <target name="init"> <!-- Create the time stamp --> <tstamp/> <!-- Create the build directory structure used by compile --> <mkdir dir="${build}"/> </target> <target name="compile" depends="init" description="compile the source " > <!-- Compile the java code from ${src} into ${build} --> <javac srcdir="${src}" destdir="${build}"/> </target> <target name="dist" depends="compile" description="generate the distribution" > <!-- Create the distribution directory --> <mkdir dir="${dist}/lib"/> <!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file --> <jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/> </target> <target name="clean" description="clean up" > <!-- Delete the ${build} and ${dist} directory trees --> <delete dir="${build}"/> <delete dir="${dist}"/> </target></project>

Tässä yksinkertaisessa Ant-esimerkissä näet, kuinka sinun on kerrottava Antille tarkalleen, mitä tehdä. On compile-tavoite, joka sisältää javactehtävän, joka kääntää src/main/java-hakemistossa olevan lähdekoodin target/classes-hakemistoon. Sinun on kerrottava Antille tarkalleen, missä sinun lähdekoodisi on, minne haluat tuloksena syntyvän tavukoodin tallennettavan ja miten pakata tämä kaikki JAR-tiedostoon. Vaikka on olemassa joitain viimeaikaisia kehityskohteita, jotka auttavat tekemään Antista vähemmän proseduraalisen, kehittäjän kokemus Antista on XML:llä kirjoitetun proseduraalisen kielen koodaaminen.

Kontrasti edellisen Ant-esimerkin ja Maven-esimerkin välillä. Mavenissa luodaksesi JAR-tiedoston jostain Java-lähteestä sinun tarvitsee vain luoda yksinkertainen pom.xml, sijoittaa lähdekoodisi osoitteeseen${basedir}/src/main/java ja ajaa sitten mvn install komentoriviltä. Esimerkki Maven pom.xml, jolla saavutetaan samat tulokset kuin yksinkertaisella Ant-tiedostolla, joka on lueteltu kohdassa A Simple Ant build.xml-tiedosto, on esitetty kohdassaA Sample Maven pom.xml.

A Sample Maven pom.xml.

<project> <modelVersion>4.0.0</modelVersion> <groupId>org.sonatype.mavenbook</groupId> <artifactId>my-project</artifactId> <version>1.0</version></project>

Muuta ei tarvita pom.xml-tiedostossa. Suorittamalla mvn install komentoriviltä voit käsitellä resursseja, kääntää lähdekoodin, suorittaa unittestejä, luoda JAR:n ja asentaa JAR:n paikalliseen arkistoon uudelleenkäyttöä varten muissa projekteissa. Ilman muutoksia voit ajaa mvn siteja sitten löytää target/site:stä index.html-tiedoston, joka sisältää linkit JavaDociin ja muutaman raportin lähdekoodistasi.

Todennäköisesti tämä on yksinkertaisin mahdollinen esimerkkiprojekti, joka sisältää vain vähän lähdekoodia ja tuottaa yksinkertaisen JAR:n. Se onprojekti, joka noudattaa tarkasti Mavenin konventioita eikä vaadi mitään riippuvuuksia tai räätälöintiä. Jos haluaisimme ruveta muokkaamaan käyttäytymistä, pom.xml:n koko kasvaisi, ja suurimmissa projekteissa voit nähdä hyvin monimutkaisia Maven POM-kokoelmia, jotka sisältävät paljon lisäosien muokkausta ja riippuvuusilmoituksia. Mutta vaikka projektisi POM-tiedostoista tulee huomattavampia, ne sisältävät täysin erilaista tietoa kuin Antia käyttävän samankokoisen projektin rakennustiedosto. Mavenin POM-tiedostot sisältävät julistuksia: ”Tämä on JAR-projekti” ja ”Lähdekoodi on src/main/java”. Antin rakennustiedostot sisältävät eksplisiittisiä ohjeita: ”Tämä on projekti”, ”Lähdekoodi on src/main/java”, ”Suorita javaca tähän hakemistoon”, ”Laita tulokset osoitteeseen target/classes”, ”Luo JAR-tiedosto osoitteesta ….” jne. Siinä missä Antin piti olla eksplisiittinen prosessin suhteen, Mavenissa oli jotain ”sisäänrakennettua”, joka vain tiesi, missä lähdekoodi oli ja miten sitä piti käsitellä.

Eroja Antin ja Mavenin välillä tässä esimerkissä ovat:

  • Apache Ant

    • Antilla ei ole muodollisia konventioita, kuten yhteistä projektin hakemistorakennetta tai oletusarvoista käytöstä. Sinun on kerrottava Antille tarkalleen, mistä lähdekoodi löytyy ja mihin tulosteet laitetaan. Epävirallisia konventioita on syntynyt ajan myötä, mutta niitä ei ole kodifioitu tuotteeseen.
    • Ant on proseduraalinen. Antille on kerrottava tarkalleen, mitä sen pitää tehdä ja milloin. Sinun on käskettävä sitä kääntämään, sitten kopioimaan ja sitten pakkaamaan.
    • Antilla ei ole elinkaarta. Sinun on määriteltävä tavoitteet ja tavoitteiden riippuvuudet. Sinun täytyy liittää tehtäväsarja jokaiseen tavoitteeseen manuaalisesti.
  • Apache Maven

    • Mavenilla on konventiot. Se tietää, missä lähdekoodisi on, koska olet noudattanut konventiota. Mavenin kääntäjälaajennus laittaa tavukoodin target/classes:iin, ja se tuottaa JAR-tiedoston target:iin.
    • Maven on deklaratiivinen. Sinun piti vain luoda pom.xml-tiedosto ja laittaa lähdekoodisi oletushakemistoon. Maven hoiti loput.
    • Mavenilla on elinkaari, joka käynnistettiin, kun suoritit mvn install. Tämä komento käski Mavenia suorittamaan sarjan peräkkäisiä elinkaaren vaiheita, kunnes se saavutti install-elinkaaren vaiheen. Tämän elinkaaren läpi kulkevan matkan sivuvaikutuksena Maven suoritti useita oletusarvoisia liitännäistavoitteita, jotka tekivät asioita kuten kääntämisen ja JAR:n luomisen.

Mavenilla on sisäänrakennettua älykkyyttä tavallisista projektitehtävistä Mavenin liitännäisten muodossa. Jos haluaisit kirjoittaa ja suorittaa yksikkötestejä, sinun tarvitsee vain kirjoittaa testit, sijoittaa ne osoitteeseen${basedir}/src/test/java, lisätä testejä koskeva riippuvuus joko TestNG:stä tai JUnitista ja ajaa mvn test. Jos haluaisit ottaa käyttöön web-sovelluksen etkä JAR:ia, sinun tarvitsee vain vaihtaa projektityyppi war:ksi ja sijoittaa docroot${basedir}/src/main/webapp:iin. Voit toki tehdä tämän kaiken Antin avulla, mutta kirjoitat ohjeet tyhjästä. Antissa sinun pitäisi ensin selvittää, missä JUnitin JAR-tiedoston pitäisi olla. Sitten sinun on luotava luokkapolku, joka sisältää JUnitJAR-tiedoston. Sitten kertoisit Antille, mistä sen pitäisi etsiä testilähdekoodia, kirjoittaisit tavoitteen, joka kääntää testilähdekoodin tavukoodiksi, jasuorittaisit yksikkötestit JUnitin avulla.

Ilman tukevia teknologioita, kuten antlibs ja Ivy (vaikka näitä tukevia teknologioita olisikin olemassa), Antilla on c`ustom-proseduraalisenbuildin tuntu. Tehokkaassa Mavenin POM-sarjassa projektissa, joka noudattaaMavenin oletettuja konventioita, on yllättävän vähän XML:ää verrattuna Ant-vaihtoehtoon. Toinen Mavenin etu on riippuvuus laajasti jaetuista Maven-lisäosista. Kaikki käyttävät Mavenin Surefire-liitännäistä yksikkötestaukseen, ja jos joku lisää tuen uudelle yksikkötestauskehykselle, voit saada uusia ominaisuuksia omaan rakennukseesi vain lisäämällä tietyn Maven-liitännäisen version projektisi POM:iin.

Päätös Mavenin tai Antin käytöstä ei ole binäärinen, ja Antilla on edelleen paikkansa monimutkaisessa rakennuksessa. Jos nykyinen rakentamisesi sisältää jonkin pitkälle räätälöidyn prosessin tai jos olet kirjoittanut joitakin Ant-skriptejä suorittamaan tietyn prosessin tietyllä tavalla, jota ei voi mukauttaa Maven-standardeihin, voit silti käyttää näitä skriptejä Mavenin kanssa. Ant on saatavilla Mavenin peruslisäosana. Mukautetut Maven-liitännäiset voidaan toteuttaa Antissa, ja Maven-projektit voidaan määrittää suorittamaan Ant-skriptejä Maven-projektin elinkaaren aikana.

Leave a Reply