Build systems

Java programok fordítása

Már viszonylag kevés forrásfájllal is nehézkes lehet:

  • Parancssoros fordítás könnyen bonyolultá válhat már kis alkalmazásoknál is.
  • Nagyobb programoknál követhetetlenné válik, hogy mely fordítási egységeket kell újrafordítani.
    • Az egész alkalmazást újra lefordítani nagyon időigényes lehet.

Build system elvárások

  • A kód fordítása
    • Dependenciák a fordítási target-ek kezelése
  • Futtatható fájlok csomagolása
    • Több release opció támogatása
  • Automatikus tesztfuttatás
  • Futtatható fájlok feltöltése teszt szerverre
  • A kód átmásolása egyik helyről a másikra
  • Csomag repo-k kezelése

ANT

  • Imperatív megközelítés

  • Java projektekhez gyakran használt

  • XML-alapú build fájl

    • tartalmazza a project gyökér elemet amely megadja:
      • a projekt nevét,
      • az alapértelmezett target-et
      • A projekt főkönyvtárát
  • A <property name="" value=""> elemmel projekttulajdonságokat tudunk definiálni.

Target

  • Target-et a <target> elemmel lehet megadni, és az ant compile parancsal futtatni.
  • Egy target függhet egy másiktól, ezt a <target depends=""> módon lehet megadni.
  • A failonerror attribútum megmondja, hogy hiba esetén félbe kell-e szakítani a folyamatot, ha az adott target hibát dob.

További példák

lsd.: diasor

Maven

  • Szoftver projekt kezelő eszköz
  • Build, teszt futtatás, dependencia kezelés, dokumentáció
  • Csomagok: automatikus letölti a dependenciákat
  • Deklaratív leírása a build folyamatnak
  • Fix könyvtár struktúra és konvenciók
    • Ezek átírhatók, de nem ajánlott
  • Tipikusan Java-hoz, de pluginokkal használható más nyelvekkel is
  • XML-alapú build fájl

Project

  • POM - Project Object Model
  • Egy projektet egyedien azonosít a csoport, artifact id, verzió. (GAV - Group, Artifact, Version)
  • Egy projekt felosztható több modulra, amik külön-külön kezelhetőek.

POM

  • Részei:

    • azonosítók: groupId, artifactId, version
    • a build folyamatának leírása
    • a build eredménye
    • tesztesetek
    • dependenciák
  • A gyökérelem szintén egy project element.

  • A következő elemeknek meg kell lenniük a projektben:

    • modelVersion: a POM specifikáció verziója
    • groupId: egyedi csoport, vagy cégazanosító. Ajánlott a Java package elnevezési konvenciók követése.
    • artifactId: a projekt egyedi neve
    • version: a projekt verziószáma
    • packaging: alkalmazott csomagolási módszer (alapértelmezett: jar, mások: pom, maven-plugin, ejb, war, ear, rar, par)

Életciklus fázisok

  • Maven egy előre meghatározott életciklust követ, amely különböző fázisokból áll. A legfontosabbak:
    • validate: validálja a projektet, és meggyőződik arról, hogy minden szükséges információ rendelkezésre áll.
    • compile: lefordítja a projektet
    • test: leteszteli a lefordított kódot (a forrásfájlok nélkül)
    • package: a lefordított kód becsomagolása a megadott formátumban (pl.: JAR)
    • integration-test: a csomag feldolgozása és megfelelő tesztelési környezetbe helyezése, ahol integrációs tesztek futtathatók.
    • verify: a csomag ellenőrzése, hogy megfelel-e a minőségi kritériumoknak
    • install: a csomag telepítése a lokális repo-ba, hogy dependenciaként használható legyen lokálisan
    • deploy: integrációs vagy release környezetbe helyezés, távoli repo-ba feltöltés.
    • clean: előzően létrehozott bináris fájlok törlése a projektből

Goal

  • A fordítási fázisok egy vagy több goal-ból áll
  • A goal egy olyan feladat, ami a projekt kezeléséhez vagy fordításához kapcsolódik.
    • Ezek sorrendje a fázis kötésétől függ
    • Sokfázis csak egy goal-t tartalmaz
  • Nem csak fázisok, de goal-ok is futtathatóak a maven paranccsal.

Repositories

  • Egy repo tartifact-okat és dependenciákat tárol.
  • Ha egy artifact elérhető lokális repo-ban, Maven azt használja
  • Különben letölti egy távoli repo-ból. (lassabb)

A build folyamat eredménye

  • a target könyvtár létrehozásra kerül fordítás során, amely az újonnan generált fájlokat tartalmazza
    • kiement, pl.: my-app-1.0.jar
    • classes könyvtár: class fájlok, amelyek a fordítás során jöttek létre (kivéve teszt osztályok)
    • test-classes: teszt osztályok
    • maven-archiver/pom.properties fájl, ami definiálja a project GAV-ját
    • surefire-reports: a tesztek eredményei

Dependenciák

  • Külső könyvtáral amit a projekt használ
  • Automatikus letöltés, ha kell
  • GAV egyedien definiálja a szükséges artifact-ot
  • Egy scope megadja a felhasználás módját:
    • compile: ez az alapértelmezett, a dependencia szükséges a fordításhoz
    • runtime: a dependencia futásidőben szükséges, de fordításkor nem
    • test: a dependencia nem kell csak tesztek fordításánál és végrehajtásánál.

Gradle

  • Build automatizáló rendszer amely egyre elterjedtebb
  • Azt ANT és a Maven-t legjobb tulajdonságait próbálja ötvözni.
  • Inkrementális build támogatás
  • XML helyett Groovy alapú nyelven (Domain Specific Language)

Források