Warning: Creating default object from empty value in /chroot/home/zerotohe/zerotohero.hu/html/wp-content/themes/salient/nectar/redux-framework/ReduxCore/inc/class.redux_filesystem.php on line 29
Archetypes | zeroToHero

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