2017 m. lapkričio 12 d., sekmadienis

Maven projekto valdymo įrankis

Maven instaliavimas

Debian šeimos Linux operacinėje sistemoje Maven galima instaliuoti aptprogramų valdymo įrankio pagalba:

$ sudo apt-get install maven

Maven konfigūracija

Windows
Nustatymai: %MAVEN_HOME%\conf\settings.xml
Lokalios repositorijos vieta: UserProfile\.m2\

Linux
Nustatymai: /usr/local/maven/conf/settings.xml
Lokalios repositorijos vieta: ~/.m2/

Nurodyti kitus Maven nustatymus:
mvn --settings=[PATH_TO_SETTINGS_FILE]
Nurodyti kitą lokalios repozitorijos vietą:
mvn -Dmaven.repo.local=/path/to/local/repo

Prieš Maven

javac komandos naudojimas projektų kompiliavimui.
• Nuo IDE (Integrated development Environment) priklausomas projektų kompiliavimas.
• GNU Make įrankis.
• Ant (Another Neat Tool) įrankis.

Maven raida

• Maven 1 (2003)
• Maven 2 (2005) - nesuderinamas su Maven 1.
• Maven 3 (2010) - suderinamas su Maven 2, stabilesnis, turintis daugiau funkcionalumo.

Kas yra Maven

• Darinio (angl. build) sukūrimo įrankis.
• Standartizuota darinio sukūrimo infrastruktūra.
• Priklausomybių (angl. dependency) valdymo įrankis.
• Kokybės įrankis.
• Atviro kodo Apache projektas.

Maven filosofija

• Susitarimas per konfigūracija (mažiau konfigūracijos).
• Lengvas darinio sukūrimo procesas.
• Geriausių praktikų šablonai.
• Nuoseklus darinio sukūrimas.


Maven temos

• Katalogų struktūra
• Darinio gyvavimo ciklas (angl. lifecycle)
• Projekto aprašas (angl. descriptor)
• Priklausomybės (angl. dependencies)
• Papildiniai (angl. plugins)
• Savybės (angl. properties)
• Profiliai (angl. profile)
• Archetipas

Standartinė Maven projekto struktūra

src Visas projekto išeities kodas
src/main Projekto pagrindinio artefakto išeities kodas
src/main/java Projekto java išeities kodas
src/main/resources Nekompiliuojami projekto resursai
src/main/webapp Projekto žiniatinklio aplikacijos resursai
src/test Projekto testavimui skirtas išeities kodas
src/test/java Projekto testavimo java išeities kodas
src/test/resources Projekto nekompiliuojami testavimo resursai
target Maven darbinis katalogas
pom.xml Projekto aprašo byla

Darinio gyvavimo ciklai

• Maven paremtas darinio gyvavimo ciklais, skirtais artefaktų sukūrimui (pvz. jar byla, war byla) ir paskirstymui .
• Yra trys įtaisyti (angl. build-in) darinių gyvavimo ciklai:
• Default - atsakingas už projekto darinio pagaminimą ir įdiegimą,
• Clean - atsakingas už projekto išvalymą,
• Site - atsakingas už projekto svetainės sugeneravimą.
• Kiekvienas iš išvardintų ciklų yra sudarytas iš skirtingo rinkinio fazių.
• Fazė reprezentuoja konkretų gyvavimo ciklo etapą.

Pagrindinės “Default” fazės

• validate - patikrina ar projektas korektiškas ir visa reikiama informacija yra pasiekiama.
• generate-sources - generuoja išeities kodą įtraukimui į kompiliavimą.
• generate-resources - generuoja resursus įtraukimui į paketą.
• compile - kompiliuoja projekto išeities kodą.
• test - testuoja sukompiliuotą kodą naudojant nurodytą testavimo karkasą.
• package - supakuoja sukompiliuotą kodą į nurodytą paskirstymo formatą (pvz. jar).
• integration-test - pagal poreikį, įdiegia paketus į aplinką, kurioje vykdomi integraciniai testai.
• verify - vykdo patikrinimus ar paketai atitinka kokybės kriterijus.
• install - įdiegia paketus į lokalią repozitoriją, tam, kad kiti lokalus projektai galėtų naudoti priklausomybės ryšiui.
• deploy - galutinės paketų kopijos įdiegiamos į nutolusią repozitoriją, tam, kad pasidalinti su kitais PĮ kurėjais ir projektais.

“Clean” fazės

• pre-clean - vykdo procesus, reikalingus prieš realų projekto valymą.
• clean - pašalina visas bylas, kurios buvo sugeneruotos ankstesnio darinio sukūrimo metu.
• post-clean - vykdo procesus, skirtus projekto valymo užbaigimui.

“Site” fazės

• pre-site - vykdo procesus, reikalingus pieš realų projekto sveitainės generavimą.
• site - generuoja projekto svetainės dokumentaciją.
• post-site - vykdo procesus, skirtus užbaigti svetainės generavimui ir pasiruošti svetainės įdiegimui.
• site-deploy - įdiegia sugeneruota sveitainės dokumentaciją į nurodytą žiniatinklio serverį.

Maven tikslų pavyzdžiai

Maven darinio sukūrimas yra vykdomas nurodant gyvavimo ciklo tikslus (angl. goals):
mvn install - įvykdo generate*, compile, test, package, integration-test ir install fazes.
mvn clean - įvykdo tik clean gyvavimo ciklą.
mvn clean compile - išvalo projektą ir įvykdo generate* ir compile fazes.
mvn compile install - įvykdo generate*, compile, test, integration-test, package ir install fazes.
mvn test clean - įvykdo generate*, compile, test fazes ir tada išvalo projektą.

POM - projekto aprašas


  • POM (angl. Project Object Model) saugomas byloje pom.xml.
    • Saugo projekto metaduomenis:
    • Vardas ir versija,
    • Supakavimo tipas,
    • Įrankių nuorodos (CI, SCM ir pan.),
    • Priklausomybės,
    • Papildiniai,
    • Profiliai - alternativios darinio sukūrimo konfigūracijos.
  • Naudojama XML kalba.
  • Vienas POM == vienas artefaktas.
  • POM ryšiai:
    • paveldėjimas,
    • agregavimas.

POM - projekto vardas (GAV)

Maven projektas unikaliai identifikuojamas naudojant:
  • groupId - sutartas projekto grupavimo identifikatorius (be tarpų ir kablelių),
  • artifactId - sutartas projekto vardas (be tarpų ir kablelių),
  • version - projekto versija.
GAV sintaksė yra groupId:artifactId:version

<?xml version="1.0" encoding="UTF-8"?>
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>org.lds.training</groupId>
<artifactId>maven-training</artifactId>
<version>1.0</version>
</project>

POM - supakavimas

  • Darinio tipas identifikuojamas naudojant packaging elementą.
  • Nurodo Maven kaip pagaminti projekto darinį.
  • Supakavimo tipai:
    • pom, jar, war, ear, pritaikytas (angl. custom).
    • Tipas pagal nutilėjimą yra jar.

<?xml version="1.0" encoding="UTF-8"?>
<project>
<modelVersion>4.0.0</modelVersion>
<artifactId>maven-training</artifactId>
<groupId>org.lds.training</groupId>
<version>1.0</version>
<packaging>jar</packaging>
</project>

POM - projekto paveldėjimas

POM bylos gali paveldėti sekančią konfigūraciją: groupId, versiją, projekto konfigūraciją, priklausomybes, papildinius, profilius ir t.t.

<?xml version="1.0" encoding="UTF-8"?>
<project>
<parent>
<artifactId>maven-training-parent</artifactId>
<groupId>com.eisgroup.training</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>maven-training</artifactId>
<packaging>jar</packaging>
</project>

POM - moduliai
  • Maven turi puikų daugėlio modulių palaikymą.
  • Kiekvienas Maven projektas sukuria 1 pagrindinį artefaktą.
  • Tėvo (angl. parent) POM naudojamas modulių grupavimui.

<project>
...
<packaging>pom</packaging>
<modules>
<module>maven-training</module>
<module>maven-training-web</module>
</modules>
</project>

Maven priklausomybės

  • Maven pakeitė Java priklausomybių valdymą - nebereikia saugoti bibliotekų išeities kodo valdymo sistemoje (SCM) ar panašiai.
  • Pasiūlyta Maven repozitorijos (angl. repository) sąvoka. Sukurta Maven Central bendruomenės repozitorija.
  • Pasiūlyta tranzityvios priklausomybės (angl. transitive dependency) sąvoka.
  • Dažnai įtraukiami išeities kodo ir javadoc artefaktai.
Pridėti priklausomybę

Priklausomybės aprašą sudaro:
  • GAV (groupId, artifactId, version).
  • Galiojimo sritis (angl. scope) - compile, test, provided. Pagal nutylėjimą naudojama compile.
  • Tipas - jar, pom, war, ear, zip ir t.t. Pagal nutylėjimą naudojamas jar.

<project>
...
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>

Maven repozitorija
  • Priklausomybės yra parsiunčiamos iš repozitorijų naudojant http protokolą.
  • Parsiųstos priklausomybės yra išsaugomos lokalioje repozitorijoje (pvz. ${user.home}/.m2/repository)
  • Repozitorijoje naudojama {groupId}/{artifactId}/{version}/{artifactId}-{version}.jar katalogų
  • struktūra. groupId ‘.’ yra pakeičiamas ‘/’.
  • Maven Central yra pagrindinė Maven bendruomenes repozitorija http://repo1.maven.org/maven2
Pridėti repozitoriją

  • Repozitorijos aprašomos POM.
  • Repozitorijos gali būti paveldėtos iš tėvo POM.
  • Momentinių kopijų (angl. snapshot) parsiuntimas gali būti kontroliuojamas.

<project>
...
<repositories>
<repository>
<id>lds-main</id>
<name>LDS Main Repo</name>
<url>http://code.eisgroup.com/nexus/content/groups/main-repo</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>

Tranzityvios priklausomybės
  • Tranzityvi priklausomybė yra tokia priklausomybė, kuri turi būti įtraukta, kai priklausomybę deklaruojantis projektas yra pats kito projekto priklausomybė:
    • ProjectA priklauso nuo ProjectB
    • Jei ProjectC priklauso nuo ProjectA, tai ProjectB yra automatiškai įtraukiamas.
  • Tik compile ir runtime galiojimo sritys yra tranzityvios.
  • Tranzityvios galiojimo sritys yra valdomos naudojant:
    • Pašalinimus (angl. exclusions),
    • Neprivalomą (angl. optional) deklaraciją.
Priklausomybės pašalinimas

Tranzityvi priklausomybė pašalinama naudojant exclusions elementą:

<project>
...
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.0.5.RELEASE</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>

Neprivaloma priklausomybė

Neskleidžia tranzityviai priklausomybės:
  • ProjectA turi neprivalomą priklausomybę nuo ProjectB.
  • Jei ProjectC priklauso nuo ProjectA tai ProjectB nebus automatiškai įtraukiamas.

<project>
...
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.0.5.RELEASE</version>
<optional>true</optional>
</dependency>
</dependencies>
</project>

Priklausomybių valdymas
  • Java neleidžia naudoti kelių versijų vienu metu.
  • Ką daryti jei versijos persikerta?
    • Leisti Maven nuspręsti, kuria versiją naudoti - sunkiau nuspėjamas rezultatas.
    • Valdyti versijas rankiniu būdu.
  • Priklausomybių versijos valdomos naudojant dependencyManagement elementą.
  • Kiti panaudojimai:
    • Leisti tėvo POM valdyti versijas,
    • Suvienodinti pašalinimus.
Maven papildiniai

  • Išplečia Maven funkcionalumą.
  • Identifikacijai naudojamas GAV (groupId, artifactId, version).
  • Papildinio naudojimo būdai:
    • Prikabinti prie darinio kūrimo gyvavimo ciklo,
    • Iškviesti autonomiškai (angl. standalone).

Prikabinimas prie gyvavimo ciklo
  • Leidžia papildinį įvykdyti kaip Maven darinio kūrimo dalį.
  • Papildinio aprašymo elementai naudojami vykdymo konfigūravimui:
    • Phase
    • Goal
    • Configuration

<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.0</version>
<configuration>
...
</configuration>
<executions>
<execution>
<id>execute</id>
<phase>validate</phase>
<goals><goal>enforce</goal></goals>
<configuration>
...
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

Papildinio valdymas

  • Leidžia sukonfigūruoti sekančius papildinio elementus, jo nevykdant:
    • Version
    • Configuration
    • Executions
  • Vykdymui naudojamas:
    • įprastas papildinio įrašas,
    • papildinio autonominė komanda.
<project><build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.0</version>
<configuration>
...
<ignoreCache>true</ignoreCache>
</configuration>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
</plugin>
</plugins></build></project>


Papildinio paveldėjimas
  • Papildinys paveldi PluginManagement konfigūraciją.
  • Papildinys ir PluginManagement gali paveldėti konfigūracija iš tėvo POM.
  • Taip pat leidžiama pakeisti paveldėtą konfigūraciją.
Papildinio autonominis įvykdymas

Papildinys gali būti išviečiamas naudojant komandinę eilutę:

  • GroupId:ArtifactId:Version:Goal
  • Naudojama PluginManagement konfigūracija.
  • Konfigūracija gali būti nurodyta sisteminėmis savybėmis.

mvn org.apache.maven.plugins:maven-enforcer-plugin:1.0:enforce

Jei papildinys sukonfigūruotas POM arba settings.xml tai iškvietimas gali būti sutrumpintas:

mvn enforcer:enforce

Maven savybės

  • Savybės tai tarsi klijai, kurie suriša konfigūracija.
  • Savybes galima nurodyti sekančiose vietose:
    • <properties/> elementas POM byloje,
    • Sisteminės savybės,
    • POM struktūra.
  • Savybių reikšmę galima panaudoti įvairiausiose vietose:
    • Versijos konfigūravimui,
    • Papildinio konfigūravimui,
    • Resursų filtravimui.
  • Savybėse nurodomos tik primityvios reikšmės.
POM savybės

<project>
...
<properties>
<skipEnforcer>true</skipEnforcer>
<enforcerVersion>1.0</enforcerVersion>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>${enforcerVersion}</version>
<configuration>
<skip>${skipEnforcer}</skip>
</configuration>
</plugin>
</plugins></build></project>

Sisteminės savybės

Nurodomos komandinėje eilutėje panaudojus “-D”:
mvn clean install –Dmaven.test.skip=true

Sisteminės savybės turi viršenybę prieš POM savybės.

POM struktūros savybės

  • Savybės gali būti paveldėtos iš POM struktūros.
  • POM elementai yra savybių raktai:
    • Išraiška ${project.version} yra elementas
      <project><version/></project>.
    • Išraiška ${project.artifactId} yra elementas
      <project><artifactId/></project>.
    • Išraiška ${project.build.sourceDirectory} yra elementas
      <project><build><sourceDirectory/></build></project>.
  • Specialios savybės:
    • ${basedir} - einamojo projekto katalogas.
    • ${maven.build.timestamp} - darinio kūrimo pradžios laikas.
<project>
...
<properties>
<skipTests>true</skipTests>
<skipEnforcer>${skipTests}</skipEnforcer>
</properties>
</project>

<project>
<parent>
...
</parent>
<properties>
<skipTests>false</skipTests>
</properties>
</project>

Resursų filtravimas
  • Projekto resursai gali naudoti savybes.
  • Resursai filtruojami process-resources fazėje.
  • Filtravimas gali buti išjungtas nurodytiems resursų katalogams.

<project>
...
<properties>
<someProperty>SomeValue</someProperty>
</properties>
</project>

Maven profiliai

  • Leidžia aktyvuoti rinkinį alternatyvių konfigūracijų.
  • Gali būti naudojami nurodyti:
    • savybes,
    • priklausomybes,
    • papildinius,
    • kita.
  • Paveldi ir išplėčia bazinę konfigūraciją.
Profilio pavyzdys 1

<project>
...
<profiles>
<profile>
<id>enforcer</id>
<activation/>
<properties>
<enforcer.skip>false</enforcer.skip>
</properties>
</profile>
</profiles>
</project>

Profilio pavyzdys 2

  • mvn exec:exec - vykdo Java programa atskirame procese.
  • mvn exec:java - vykdo Java programa toje pačioje VM, kaip ir Maven.
  • mvn exec:java -Dexec.mainClass="com.example.Main" [-Dexec.args="argument1"] ...

<profiles>
<profile>
<id>run</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<executions>
<execution>
<goals><goal>java</goal></goals>
<phase>runtime</phase>
</execution></executions>
<configuration>
<mainClass>ClassWithTheMain</mainClass>
</configuration>
</plugin></plugins></build></profile></profiles>


Profilio aktyvavimas

Profilis gali būti aktyvuotas:
  • pagal nutylėjimą,
  • tiesiogiai pagal profilio vardą,
  • priklausomai nuo savybės,
  • priklausomai nuo operacinės sistemos,
  • priklausomai nuo bylos egzistavimo.
Aktyvavimas komandinėje eilutėje

mvn clean install –P enforcer

Keletas profilio identifikatorių yra atskiriami kableliu.

Archetipas

  • Archetipas yra Maven projektų šablonų priemonių komplektas.
  • Bendresnis archetipo apibrėžimas būtų autentiškas šablonas ar modelis, kurį naudojant yra gaminami kiti tos pačios rūšies dalykai.
Maven projekto sukūrimas

Paprasto projekto sukūrimas:
mvn archetype:generate -DgroupId= com.mycompany.app -DartifactId= my-app -
DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

Eclipse IDE projekto failų sukūrimas:
mvn eclipse:eclipse

Idea IDE projekto failų sukūrimas:
mvn idea:idea

Komentarų nėra:

Rašyti komentarą

Etiketės