Apache Maven è un software per la gestione di progetti. Basato sul concetto di project object model (POM), un punto centralizzato di informazione, Maven può gestire la build, i report la documentazione, e molto altro.
1. LINUXDAY 2012
www.linuxday.it
Apache Maven
Tarin Gamberini
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 1
2. LINUXDAY 2012
www.linuxday.it
Licence
This document is distribuited under the following licence:
AttributionNonCommercialShareAlike 3.0 Unported
(CC BYNCSA 3.0)
Attributing to the author must be done by citing author's name
and surname: Tarin Gamberini
Information about this licence are available at:
http://creativecommons.org/licenses/byncsa/3.0/
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 2
3. LINUXDAY 2012
www.linuxday.it
Argomenti
Introduzione
– Apache Maven... Cos'è?
– Convention over Configuration
Principali caratteristiche
– Project Object Model
– Local Repository
– Dependency
– Build Lifecycle
– Build Profiles
Oltre un build tool
– Site Generation
– Maven Repository Manager
– Maven DocBook plugin
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 3
4. LINUXDAY 2012
www.linuxday.it
Chi è Tarin Gamberini
Lavora da sempre con tecnologie Java-based
free ed opensource presso la Regione Emilia-
Romagna
E' Consigliere presso il Java User Group Padova
e si occupa di organizzazione e promozione di
meeting a favore della comunità Java
E' membro, e co-fondatore, della Commissione
Ingegneria dell'Informazione presso l'Ordine
degli Ingegneri di Ferrara
Si interessa di Object Oriented Design, Design
Patterns, Build Automation, Testing e
Continuous Integration
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 4
5. LINUXDAY 2012
www.linuxday.it
Introduzione
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 5
6. LINUXDAY 2012
www.linuxday.it
Apache Maven... Cos'è?
Dipende dai punti di vista
Un build tool
– Preprocessing, compilation, packaging, testing,
distribution
– C'era già Apache Ant
Un project management tool
– Build tool più evoluto
– Esegue reports, genera un sito web del progetto,
agevola la comunicazione fra i membri di un
working team
– Estendibile grazie ad architettura a plugin
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 6
7. LINUXDAY 2012
www.linuxday.it
Apache Maven... Cosa offre?
Prima
– Checkout dal Revision Control System (RCS)
– Cosa serve al progetto per compilare?
– Quali librerie devono essere scaricate?
– Dove mettere tali librerie?
– Quali operazioni sono eseguibili con la procedura di build?
– Come compilare, impacchettare, testare, distribuire il progetto?
– In quali directory sono creati i “prodotti” della procedura di build?
– Pochi minuti :-) Qualche ora :-( Molte ore :-(((
Maven offre un'interfaccia comune di progettazione del build
– Checkout dal RCS
mvn install
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 7
8. LINUXDAY 2012
www.linuxday.it
Convention over Configuration
Sistemi, librerie, framework, ecc... configurabili
dovrebbero essere già progettati con una
configurazione di default ragionevole, affinché,
semplicemente, funzionino subito
– Configurare solo ciò che devia dal
comportamento convenzionale
– Semplifica la programmazione senza perdere
necessariamente in flessibilità
Risposta alla crescente complessità dei framework
– Molti file, ognuno con molte impostazioni: filename, dirname,
URL, mapping, db, gui, …
– JavaBeans (since JDK 1.1), servono file di configurazione?
Paradigma di progettazione ormai adottato da molti
framework: Spring, Ruby on Rails, EJB, Grails, Zend
Framework, Pylons, ecc...
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 8
9. LINUXDAY 2012
www.linuxday.it
Licenza
Apache Maven è distribuito sotto Apache License, Version 2.0
Mai sentita?
Alla pagina http://www.gnu.org/licenses/license-list.it.html
Apache License, Version 2.0 è una licenza di software libero,
compatibile con la versione 3 della GNU GPL.
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 9
10. LINUXDAY 2012
www.linuxday.it
Installazione
Andare a http://maven.apache.org/download.html
Necessario avere già installato Java Development Kit (JDK)
Scaricare Maven e decomprimerlo in una cartella
/usr/local/apachemaven
Creare (export) le variabili d'ambiente
M2_HOME=/usr/local/apachemaven/apachemavenX.Y.Z
M2=$M2_HOME/bin
Aggiungere (export) al path
PATH=$M2:$PATH
Assicurarsi di avere nel path la variabile d'ambiente
JAVA_HOME che punta alla JDK
Verificare la corretta installazione
mvn version
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 10
11. LINUXDAY 2012
www.linuxday.it
Principali caratteristiche
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 11
12. LINUXDAY 2012
www.linuxday.it
Il Project Object Model (POM)
Il POM è descritto in un file pom.xml
La presenza di un file pom.xml in una directory
definisce quest'ultima come contenente un
progetto Maven
Nel pom.xml è dichiarato l'identità e la struttura di un progetto
– Identità definita tramite coordinate
– Raramente è stand alone
– Solitamente dipende da altri progetti
– Solitamente eredita configurazioni dal parent POM
– Può includere sotto progetti detti moduli
(Analogo di un Ant build.xml o di di un Makefile)
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 12
13. LINUXDAY 2012
www.linuxday.it
Il POM più semplice
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.taringamberini</groupId>
<artifactId>linuxdaydemo</artifactId>
<version>1.0.0</version>
</project>
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 13
14. LINUXDAY 2012
www.linuxday.it
Il POM più semplice
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.taringamberini</groupId>
<artifactId>linuxdaydemo</artifactId>
<version>1.0.0</version>
</project>
Identità del progetto definita tramite coordinate
(groupId, artifactId, version) = (x, y, z)
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 14
15. LINUXDAY 2012
www.linuxday.it
Il POM più semplice
La struttura del progetto segue
una convenzione
Il comportamento della build è
groupId una convenzione
artifactId
La convenzione è ereditata dal
super POM
Super POM
Ereditarietà
com.taringamberini
linuxdaydemo
1.0.0
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 15
16. LINUXDAY 2012
www.linuxday.it
Local Repository
Maven crea nella directory
utente la directory .m2
.m2/settings.xml
Un file contenente
configurazioni specifiche
dell'utente relative ad
autenticazione, repositories,
ed altre informazioni per
customizzare il
comportamento di Maven
.m2/repository/
La directory contenente il
repository locale di Maven
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 16
17. LINUXDAY 2012
www.linuxday.it
Local Repository
Maven cerca le dipendenze (librerie) nel repository locale
PC
1
pom.xml
2
3
local
repository
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 17
18. LINUXDAY 2012
www.linuxday.it
Local Repository
Maven cerca le dipendenze (librerie) nel repository locale
Se non la trova in locale Maven cerca in un repository remoto
e la immagazzina nel repository locale !!!
Maven ha bisogno della connessione ad Internet
PC Internet
1
pom.xml 3
2
5 remote
4 repository
local
repository
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 18
19. LINUXDAY 2012
www.linuxday.it
Dipendenze del Progetto
Quando un progetto necessita di una libreria si
dice che il progetto ha una dipendenza
Compile (default)
– Disponibili in tutti i classpath, sono impacchettate
Provided
– Disponibili nel compile classpath (non nel runtime), non sono
impacchettate, non sono transitive (per es. Servlet API jar)
Runtime
– No compile classpath, disponibile nei runtime classpath, anche
per l'esecuzione dei test (per es. JDBC API jar)
Test
– Solo nelle fasi compile ed test execution, non sono transitive
System
– File system locale (sconsigliato: preferire un Maven repository)
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 19
20. LINUXDAY 2012
www.linuxday.it
Dipendenze di Progetto junit
junit
Le dipendenze si dichiarano nel pom.xml 3.8.1
<project>
...
com.taringamberini
<dependencies> linuxdaydemo
<dependency> 1.0.0
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
</dependency>
...
</dependencies>
...
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 20
21. LINUXDAY 2012
www.linuxday.it
Dipendenze di Progetto junit
junit
Le dipendenze hanno uno scope 3.8.1
<project> test
...
com.taringamberini
<dependencies> linuxdaydemo
<dependency> 1.0.0
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
...
</dependencies>
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 21
22. LINUXDAY 2012
www.linuxday.it
Dipendenze transitive
Una dipendenza transitiva è una dipendenza
di una dipendenza
it.jugpadova
jugevents-web
3.0-SNAPSHOT org.parancoe org.parancoe
parancoe-web parancoe-core
3.0-SNAPSHOT 3.0-SNAPSHOT
org.lambico
lambico-spring-hibernate
1.0-SNAPSHOT
Maven gestisce le dipendenze transitive (free developers) !!!
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 22
23. LINUXDAY 2012
www.linuxday.it
Esempio di un grafo delle dipendenze
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 23
24. LINUXDAY 2012
www.linuxday.it
Risoluzione dei conflitti
Due dipendenze dirette, a loro volta, hanno una dipendenza
diretta su uno stesso (groupId, artifactId, ?)
– Maven risolve automaticamente la dipendenza transitiva a favore
della versione più recente (make developer aware by asking)
Una dipendenza diretta, a sua volta, ha una dipendenza diretta
su un indesiderato (groupId, artifactId, ?)
– Maven consente dichiarazione manuale delle esclusioni
Indesiderato?
– Per ridurre il numero di librerie distribuite. Per es: dipendenza
transitiva non dichiarata esplicitamente di scope runtime, e
riferita a funzionalità opzionali che non intendo usare
– Per indicare una specifica implementazione di una libreria fra
varie disponibili
– Per problemi di licenza relativamente alla distribuzione (binari,
sorgenti, javadoc)
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 24
25. LINUXDAY 2012
www.linuxday.it
Risoluzione dei conflitti
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>3.2.5.ga</version>
<exclusions>
<exclusion>
<groupId>javax.transaction</groupId> Sun JTA API JAR,
<artifactId>jta</artifactId> non è
</exclusion> disponibile nel
</exclusions>
repository
</dependency>
centrale di
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
Maven poiché
<artifactId>geronimo-jta_1.1_spec</artifactId> non può essere
<version>1.1</version> liberamente
</dependency> distribuita
</dependencies>
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 25
26. LINUXDAY 2012
www.linuxday.it
Dependency Management
Centralizza ed agevola la gestione delle versioni degli artefatti
<project>
...
<dependencyManagement>
<dependencies>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logbackclassic</artifactId>
<version>1.0.6</version>
</dependency>
</dependencies>
</dependencyManagement>
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 26
27. LINUXDAY 2012
www.linuxday.it
Dependency Management
In un pom.xml figlio si omette la versione ereditata dal padre
<project>
...
<dependencies>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logbackclassic</artifactId>
<version>1.0.6</version>
</dependency>
</dependencies>
Con dependencyManagement in un pom.xml antenato i figli
ereditano se dichiarano (groupId, artifactId)
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 27
28. LINUXDAY 2012
www.linuxday.it
Project Inheritance
<project>
<parent> Super POM
<groupId>com.taringamberini</groupId>
Implicita
<artifactId>linuxdaydemo</artifactId>
<version>1.0.0</version> com.taringamberini
</parent> linuxdaydemo
1.0.0
<artifactId>linuxdaybook</artifactId>
... Esplicita
Sono ereditati: dependencies, developers, com.taringamberini
plugin lists, reports lists, plugin executions, linuxdaybook
plugin configuration 1.0.0
mvn help:effectivepom
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 28
29. LINUXDAY 2012
www.linuxday.it
Multi-module vs. Inheritance
Super POM
Ereditarietà
com.taringamberini
linuxdaydemo
1.0.0 com.taringamberini
java-sources
1.0.0
com.taringamberini Sotto modulo
linuxdaybook
1.0.0 com.taringamberini
linuxday-chapters
1.0.0
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 29
30. LINUXDAY 2012
www.linuxday.it
Build Lifecycle pre-clean
Build Lifecycle: una sequenza di fasi
clean
identificate ognuna da un nome
post-clean
Maven Plugin: insieme di uno o più goal
Goal: un compito specifico da eseguire
– La più piccola “unita di lavoro” eseguibile
da Maven
– Identificato come pluginId:goalId
Un goal può essere associato ad una fase
– Quando l'esecuzione del ciclo di vita
raggiunge la fase package allora è
eseguito il goal jar del plugin jar
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 30
31. LINUXDAY 2012
www.linuxday.it
Build Lifecycle
Esecuzione
– surfire:test esegue solo il
goal test del plugin surfire
– test esegue tutti i goal
associati a tutte le fasi fino
alla fase test
Principali build lifecycle
– clean
Rimuove la directory target
– default (build)
modello generale di un
processo di build
– site
genera un sito contenente
documentazione di progetto,
e report: esito test, team, ...
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 31
32. LINUXDAY 2012
www.linuxday.it
Build Lifecycle
Quale goal, di quale plugin, deve essere associato ad una fase
di un ciclo di vita è funzione del packaging
<project>
...
<groupId>it.jugpadova</groupId>
<artifactId>jugeventsweb</artifactId>
<version>3.0SNAPSHOT</version>
<packaging>war</packaging>
...
Sono già definiti i packaging: jar, war, ear, ejb, pom
E' possibile programmare nuovi: plugin, lifecycle, packaging
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 32
33. LINUXDAY 2012
www.linuxday.it
Build Profile
I profili consentono di specificare una build specifica per un
determinato ambiente
Build portabile fra vari i ambienti: SVIL, TEST, PROD
<project>
...
<profiles>
<profile>
<id>production</id>
<properties>...</properties>
<build>...</build>
<dependencies>...</dependencies>
<repositories>...</repositories>
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 33
34. LINUXDAY 2012
www.linuxday.it
Oltre un build tool
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 34
35. LINUXDAY 2012
www.linuxday.it
Site Generation
Per la buona riuscita di un progetto gli aspetti comunicativi
non sono da trascurare
Serve un modo semplice per pubblicare online e mantenere
documentazione
Sul sito del progetto si cerca:
– End-users: tutorials, guide utente, documentazioni delle API,
mailing list
– Developers: documentazione di progetto, report sul codice,
issue tracking, roadmap e release plans
– Wiki, report generati da sistemi di continuous integration, ...
Generare un sito
mvn site
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 35
36. LINUXDAY 2012
www.linuxday.it
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 36
37. LINUXDAY 2012
www.linuxday.it
Repository Manager
E' un proxy altamente configurabile fra la nostra azienda ed il
repository pubblico di Maven
E' un repository Maven privato nella nostra azienda in cui
deployare gli artifact: condivisione fra l'intero team di sviluppo
intranet Internet
Developer 1
repository remote
manager repository
Developer 2
Developer 3 Developer 4
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 37
38. LINUXDAY 2012
www.linuxday.it
Repository Manager
Risparmio tempo e traffico
Controllo periodico delle SNAPSHOT
Controllo sulle dipendenze per
– Inclusione/esclusione di particolari artifact
– Inclusione/esclusione di particolari versioni
– Inclusione/esclusione in funzione della licenza della dipendenza
– Agevola l'adesione a requisiti di qualità e sicurezza aziendali
I principali repository manager
Apache Archiva Artifactory Nexus
http://docs.codehaus.org/display/MAVENUSER/Maven+Repository+Manager+Feature+Matrix
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 38
39. LINUXDAY 2012
www.linuxday.it
Maven Docbkx Plugin
DocBook
– È un W3C XML Schema (RELAX NG, SGML, DTD)
– È un linguaggio di markup semantico
– È particolarmente indicato per articoli e libri
Poiché DocBook è XML
– È come codice sorgente
– Storico salvato salvato sul RCS
– Controllo delle revisioni :-) per definizione di RCS
– Scrittura concorrente da parte di più autori
img
– È informaticamente elaborabile
css
Maven Docbkx Plugin
docbook_document.html
.
docbook_document.xml DocBook XSL
.
docbook_document.pdf
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 39
40. LINUXDAY 2012
www.linuxday.it
Maven Docbkx Plugin
linuxday-book.xml
linuxday-chapter-1.xml
linuxday-chapter-2.xml
linuxday-book.html
.
<xi:include docbkx-maven-plugin .
linuxday-book.pdf
src_fragment.xml
db_table_fragment.xml
my-plugin my-plugin
src db
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 40
41. LINUXDAY 2012
www.linuxday.it
Bibliografia
Maven By Example
http://www.sonatype.com/Support/Books/Maven-By-Example
Maven: The Complete Reference
http://www.sonatype.com/Support/Books/Maven-The-
Complete-Reference
The Maven Cookbook
http://www.sonatype.com/Support/Books/The-Maven-Cookbook
Apache Maven
http://maven.apache.org/index.html
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 41
42. LINUXDAY 2012
www.linuxday.it
Contatti
Tarin Gamberini
www.jugpadova.it
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 42
43. LINUXDAY 2012
www.linuxday.it
GRAZIE PER L'ATTENZIONE
Ferrara, 2012-10-27 FLUG – Ferrara Linux User Group - www.ferrara.linux.it
Tarin Gamberini JUG Padova, Apache Maven 43