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
Maven savybės
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
- 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