Projektkezelés Maven3 rendszerrel - II rész.
A projekt állomány - pom.xml felépítése
A pom.xml a központi szereplő ami a maven3 projekteket illeti. A legegyszerűbb felépítése a következő (ezt generáltuk le az előző blog bejegyzésben):
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.thotsoft</groupId>
<artifactId>rendezes</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>rendezes</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
A zölddel jelölt rész magára az előállítandó termékre tartalmaz fontos információt. Később még erre visszatérünk. A kékkel jelölt rész, az magáról a projektről tartalmaz információkat. Pl. ha majd dokumentációt gyártunk ez a rész hasznos lesz. Itt fogunk tudni majd megadni egyéb infókat is, mint pl. a projektben részt vevő fejlesztők, stb. A narancssárgával jelölt rész különböző jellemzők beállítása. Itt például, egy a forrás kódolására adtunk meg beállítást: UTF-8 a források nyelvi kódolása. Ezt a részt is majd bővíteni fogjuk, később majd látni fogjuk.
A pirossal megadott rész a függőségekre vonatkozik. Itt soroljuk fel, hogy az alkalmazásunknak mire van szüksége, pontosabban mely osztály könyvtárakra (jar) van szükség. Erre még visszatérünk.
Nézzük először a zöld részt, ismét.
A zöld rész:
<groupId>com.thotsoft</groupId>
<artifactId>rendezes</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
A termék beazonosítására vonatkozik, hogy később hivatkozni tudjunk rá. A groupId az a csoport azonosító. Ez azonosítja, hogy majd ezt a terméket (az eredmény jar állományt) mely csoport alá regisztrálja be a maven3. Egy csoportban természetesen több termék is lehet. A termék alatt nem csak jar-t értünk. Lehet war, ear de még egy másik pom.xml is. Az hogy a termék milyen csomagolású lesz, azt a packaging mondja meg. A mi esetünkben egy jar-ról van szó. Szóval, a csomag azonosító a com.thotsoft a termék azonosítója pedig a rendezés, amelyet a artifactId-val adunk meg. Még egy fontos információ, a verzió azonosító. Ezt a version elemmel adjuk meg. Jelenleg 1.0-SNAPSHOT. A SNAPSHOT-al jelöljük általában a fejlesztés alatt levőt, míg a RELEASE-el a végleges, ellenőrzés és kiadott terméket. Na most, azt nézzük meg, hogy ezt az infót hogyan használja fel maven3?
Az előző blog bejegyzésben a végén kiadtuk a rendezes könyvtárban a
mvn clean install
parancsot. Ezáltal lefordultak a generált osztályok, lefutott a tesztelés, majd előállt a termék. A clean az a 'target' alkönyvtár törlését jelenti. Tehát minden ami ideiglenes termék. Az előállított termék a target alatt találhat rendezes-1.0-SNAPSHOT.jar néven. Ha megnézzük az elnevezést, akkor látni fogjuk, hogy mit mire használt fel a maven:
rendezes-1.0-SNAPSHOT.jar == ${artifactId}-${version}.${packaging}
És ez nem minden. Az install hatására a local repository-nkba is installálta a terméket. Ez mit is jelent? Nézzük meg! Navigáljunk el a maven3 repository alkönyvtárba és nézzük meg, hogy milyen könyvtárak vannak. Látni fogunk egy rakat könyvtárat. Pl. com, org, net, stb.
Menjünk bele a com alkönvytárba. Látni fogjuk, hogy a thotsoft is ott van. Menjünk bele ebbe is. Látni fogjuk, hogy benne van a rendezes alkönyvtar is. Menjünk bele ebbe is. Látni fogjuk, hogy ott a 1.0-SNAPHOT alkönyvtár. Lépjünk bele ebbe is, és megtaláljuk a termékünket, a rendezes-1.0-SNAPSHOT.jar állományt.
Tehát a teljes elérési útvonal: ${MAVEN_REPOSITORY}\com\thotsoft\rendezes\1.0-SNAPSHOT\rendezes-1.0-SNAPSHOT.jar
Szóval, a maven3 a groupId-t a csomag elnevezés szerint ('.' az elválasztó) részekre bontotta, majd minden résznek megfelelően létrehozott egy könyvtárat, ha még nem volt. Létrehozott alatta egy könyvtárat a ${artifactId} és alatta a ${version}-ek is, majd a verzió alá betette a terméket. Nos, ez a lényeg. A maven3 központilag tárolja a különböző termékeket, egy könyvtár struktúrában, melyet a fentiekben szemléltettünk. Ez mindegyikre igaz. A maven3-nál nem kell lokálisan, projekten belül kézzel letölteni, és egy lib alkönyvtár alá (pl. ahogy ant-nál, vagy eclipse-nél szoktuk megadni) elhelyezni a szükséges osztálykönyvtárakat. A maven3-nál csak a hivatkozást kell megfelelően megadni, és ő megpróbálja azt megkeresni a local repository-ba, a lokális tárolóba. Ha megtalálja, akkor ezt az osztály könyvtárat elérhetővé teszi a fordításhoz, ha pedig majd csomagolni is kell (pl. war-ba vagy ear-ba), akkor a megfelelő helyre át is másolja. Egyszerű, nem?
Ezek után már könnyű megérteni a pirossal írott részt. Ott ugyanis egy hivatkozás van, egy függőség. Jelenleg ezt a függőséget a teszteléskor használja a rendszer, a junit csomagot (járjunk utána, hogy ez a jar hol helyezkedik el a repository-ba). A függőség megadása ugyanolyan elven történik, mint ahogy a termékünk elnevezése is történt:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
groupId a csoportot azonosítja, a kiadót azonosítja sok esetben, az artfictId pedig a termék azonosító, illetve a verzió. Egy új mező is van, ez a scope . A scope ebben az esetben azt jelenti (más értékeket is vehet fel), hogy csakis a tesztelési ciklusban kell felhasználni ezt a jar-t, a kiadáshoz, installáláshoz nem. Így majd adott esetben, ha majd war-t vagy ear-t adunk meg, akkor a junit osztály csomag, nem kerül bele, hisz kikötöttük, hogy csak a teszteléshez kell. A scope-ra még később visszatérünk.
No de mi van akkor, ha nincs meg a lokási repository-ba az a jar, amire szükségünk lenne? Ebben az esetben a maven3 megpróbálja letölteni azt egy távoli maven3 repository-ból. A maven3 repository nem más mint egy http szerver, melynél web oldalak helyett, strukturáltan a különböző csomagolású termékeket találjuk meg. Ha nem adunk meg semmilyen repository-t, akkor az úgy nevezett maven3 central repository-ból próbálja leszedni. Ez a: http://repo.maven.apache.org/ címen található és azon belül a maven2 oldal alatt:
Ez a cím nem alkalmas arra, hogy beletekintsünk. Ha a tartalmát szeretnénk megnézni, akkor a http://search.maven.org/#browse címre kell menni. Ha találomra kiválasztunk egyet, pl. az 'abbot' -ot. Akkor a következő hierarchiát kapjuk:
/abbot
/abbot
/0.12.3
/abbot-0.12.3.jar
/0.13
/abbot-0.13.jar
/abt
/1.0
/<üres>
Ez azt jelenti, hogy az abott mint csoport alatt van két termék - az abt az üres - és az abott-ból van két verzió. Így ha ezzel egészítenénk ki a függőségeket, akkor a következőket kellene írni:
<dependency>
<groupId>abbot</groupId>
<artifactId>abbot</artifactId>
<version>0.13</version>
</dependency>
Abban az esetben, ha ebben a repository-ban (egyszerűbben: repo) nem találnánk meg ezt a komponenst, de mondjuk egy másikban igén, pl. a java.net Maven2-es repoban (url: http://download.java.net/maven/2/), akkor ezt a pom.xml-be felvehetjük további repo definícióként. Ezt a maven fordításkor figyelembe vesszi és ebben is keresni fog. A repo hivatkozást a következőképpen adjuk hozzá a pom.xml-hez:
A <dependencies> elem felett adjuk hozzá a következőket:
<repositories>
<repository>
<id>java.net-maven2</id>
<name>Java Net Maven2 repo</name>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
A releases és a snapshots elem arra való, hogy szabályozzuk, hogy az adott repot mire akarjuk használni? Engedélyezzük-e, hogy pl. a snapshot kiadásokat is letöltse arról a szerverről a maven, vagy csak a tényleges kiadásokat (releases). Nyílván, több repot is fel lehet sorolni. Lényegében ezennel meg lennénk az alap pom.xml beállítással. Ezt a pom.xml-t folyamatosan bővíteni fogjuk a további blog bejegyzések során,de a legalapvetőbb beállítások ismertetésre kerültek.
Nézzük, hogyan tudjuk azt elérni, hogy ne keljen folyton, minden projektnél felsorolni a repo-kat. Mi lenne, ha lenne egy központi hely, amelyen keresztül valamennyi repo elérhetővé válik? Jól hangzik, nem? Ez a Sonatype Nexus alkalmazás. Ez lesz a következő bejegyzésünk tárgya.
Ha a fentiekkel kérdések merülnek fel, kérem keressetek a magyar@mail.thot-soft.com e-mail címen.
Hasznos olvasni valók:
- Maven Getting Started: http://maven.apache.org/guides/getting-started/index.html
- Maven: The complete reference: http://www.sonatype.com/books/mvnref-book/reference/
- Sonatype Maven site: http://www.sonatype.org/maven
Hungarian