Rodomi pranešimai su žymėmis maven. Rodyti visus pranešimus
Rodomi pranešimai su žymėmis maven. Rodyti visus pranešimus

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

Etiketės