Eddigi blogbejegyzéseinkben átfogó képet kaphattál a Maven eszköz használatáról, s megismerkedhettél a projektkészítés alapjaival. Annó, egyetemen, amikor még kisebb primitív alkalmazásokat kellett írni prog2-re, akkor mindig úgy nézett ki az új projekt létrehozása, hogy valami quickstart archetype-ot választottunk ki, majd kitöröltük a HelloWorld-öt :) és elkezdtük a fejlesztést. Ez jó volt, mert nem kellett kézzel összeraknunk (azt a bonyolult ;-) ) fájl struktúrát, hanem megkaptuk készen, és nekünk tényleg csak annyi dolgunk volt, hogy a dependenciákat aktualizáljuk, és írhattuk is a kódot. Azóta eltelt egy „kis” idő és a valóságba kijutva, rájöttünk, hogy más szerkezetű projekteken dolgozunk, és a quickstart már nem elég. Ha sokszor csinálsz hasonló struktúrájú projekteket, akkor megoldás lehet, hogy a skeletont lemented, és mindig azt refactorozod (group, artifact, stb, stb.). Ez nyilván könnyebbség, mert nem kell nulláról létrehozni a most már valóban komplexebb struktúrát, de azért valljuk be ez így nem a legszebb megoldás. Ennél léteznek kifinomultabb, hatékonyabb módszerek is :)
Maven Archetype-ok
A Maven lehetőséget kínál úgynevezett archetype-ok készítésére, használatára, melyek segítségével gyakorlatilag felépíthetünk egy újrafelhasználható projekt vázat, template-et. Ugye a quickstart sem más, mint egy ilyen archetype. Az archetype-okban meghatározhatjuk, hogyan fog kinézni egy projekt könyvtárstruktúrája, definiálhatjuk a pom fájl(ok) alapvető szerkezetét, valamint olyan osztályokat is előre létrehozhatunk, melyekről tudjuk, hogy szükségünk lesz rájuk a projektjeink során. Ezek általános template-k lesznek, ugyanis ahány projekt, annyi különböző eszközt használunk, és igazából ezekben a template-kben a metszeteket kellene meghatároznunk, különben túl sok utómunkálattal járhat a generált projekt aktualizálása. Nézzük meg, hogyan!
Demo Projekt
Az alábbi példában megnézzük, hogyan lehet összerakni egy ilyen dummy template-et. Az archetype struktúrája az alábbi:
Az archetype-ból generált projekt tartalmazni fogja az „archetype-resources” mappában definiált struktúrát. A legkülső pom.xml az az archetype pom-ja. Az archetype-metadata.xml az archetype leíró fájlja, s itt kell meghatározni az archetypehoz tartozó metainformációkat, például, hogy hol találhatók azok a fájlok, melyeknek a projektek létrehozásánál létre kell jönniük. A demóhoz tartozó leíró az alábbi módon fest:
<archetype-descriptor name="maven_archetype_demo">
<fileSets>
<fileSet filtered="true">
<directory></directory>
<includes>
<include>pom.xml</include>
</includes>
</fileSet>
<fileSet filtered="true">
<directory>src/main/java/__packageInPathFormat__</directory>
</fileSet>
<fileSet filtered="true">
<directory>src/test/java/__packageInPathFormat__</directory>
</fileSet>
<fileSet filtered="true">
<directory>src/main/resources</directory>
</fileSet>
<fileSet filtered="true">
<directory>src/test/resources</directory>
</fileSet>
</fileSets>
</archetype-descriptor>
Amint láthatod, először a pom fájl helyét határoztuk meg, majd a java fájlok és a resource fájlok helyét adtuk meg. A __packageInPathFormat__ egy változó, melynek helyére a projekt létrehozásakor megadott packege név fog bekerülni.
Az archetype projekt leíró pom fájlja a következőképp néz ki:
<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>hu.zerotohero</groupId>
<artifactId>maven_archetype_demo</artifactId>
<version>1.0</version>
<packaging>maven-archetype</packaging>
<build>
<extensions>
<extension>
<groupId>org.apache.maven.archetype</groupId>
<artifactId>archetype-packaging</artifactId>
<version>2.1</version>
</extension>
</extensions>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-archetype-plugin</artifactId>
<version>2.1</version>
<extensions>true</extensions>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
Ez a fájl nem túl bonyolult, ami talán érdekes lehet benne, hogy a projekt packaging típusa maven-archetype. Emellett szükség van a maven-archetype-plugin pluginre és a archetype-packaging extensionre annak érdekében, hogy működjön az archetype projekt.
Az archetype által definiált projekthez tartozó pom.xml, amely majd a generált projekt pom.xml-je lesz, jelenleg így néz ki:
<?xml version="1.0" encoding="UTF-8"?>
<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>${groupId}</groupId>
<artifactId>${artifactId}</artifactId>
<version>${version}</version>
<packaging>jar</packaging>
<dependencies>
...
</dependencies>
<build>
<plugins>
...
</plugins>
</build>
<profiles>
...
</profiles>
</project>
A pom fájlba betehetjük azokat a dependenciákat, plugin-eket, profilokat, stb. melyekről úgy ítéljük meg, hogy szükségesek lesznek a generált projektünk számára. Az archetype fájljai gyakorlatilag velocity template-ként kezelhetők, s emiatt változókat is rakhatunk a pom fájlba ${…} formátumban, melyek helyére a projekt létrehozásakor megadott értékek fognak kerülni. A fenti példában a ${groupId}, ${artifactId} és a ${version} ilyen változók.
A java fájlokba is rakhatunk velocity változókat ${…} formátumban. Léteznek előre definiált változók, mint például a minta java fájlban szereplő ${package} változó.
package ${package};
public class MavenDemo {
public static void main(String[] args) {
}
}
Használat
Mivel az archetype is egy maven projekt, így le kell fordítanunk (mvn clean install). Ennek hatására bekerül a lokális repository-nkba, és használhatóvá válik (Természetesen Nexusba feltölthető, és így már a Nexus-t használók tábora is tudja használni). Ezután már le tudjuk generáltatni az archetype-ból a projektünket:
- Új projekt készítésekor, parancssorban megadjuk az archetype-ban található változók behelyettesítési értékét:
mvn archetype:generate -DarchetypeGroupId=hu.zth -DarchetypeArtifactId=maven_archetype_demo -DarchetypeVersion=1.0
- Új projekt készítésekor, egy interaktív menü segítségével adjuk meg az archetype-ban található változók behelyettesítési értékét:
mvn archetype:generate -DarchetypeCatalog=local