Maven è un progetto open source, sviluppato dalla Apache, che permette di organizzare in modo molto efficiente un progetto java.
Può essere paragonato all'altro progetto più conosciuto della Apache, Ant, ma fornisce funzionalità più avanzate. I vantaggi principali di Maven sono i seguenti:
-
- standardizzazione della struttura di un progetto compilazione;
- test ed esportazione automatizzate;
- gestione e download automatico delle librerie necessarie al progetto;
- creazione automatica di un semplice sito di gestione del progetto contenente informazioni.
Apache Maven: download
È possibile scaricare il progetto dal sito ufficiale, la versione attualmente disponibile è la 2.0.9. Per poter installarlo è sufficiente scompattare lo zip, ad esempio nella cartella C:Maven, e aggiungere la variabile di ambiente MAVEN_HOME (MAVEN_HOME=C:Maven).
Per eseguire i comandi messi a disposizione da Maven è necessario aggiungere anche la cartella bin alla variabile d'ambiente PATH (PATH=...%MAVEN_HOME%bin;). Nella directory %MAVEN_HOME%/conf è presente il file di configurazione di Maven, il file setting.xml. In questo file è definita anche la directory locale (repository) nella quale maven gestirà le librerie (localRepository). Di default, il localRepository si trova in "/home/${user}/.m2/repository" sotto linux e in "C:Documents and Settings${user}.m2repository" sotto Windows.
Per verificare che l'installazione di Maven sia andata a buon fine, è sufficiente lanciare il comando "mvn" da riga di comando. I componenti principali di Maven sono i seguenti:
- pom.xml (POM, Project Object Model): file di configurazione che contiene tutte le informazioni su un progetto (dipendenze, test, documentazione, ecc ecc...);
- Goal: singola funzione che può essere eseguita sul progetto, l'equivalente Maven dei task Ant. I goal possono essere sia specifici per il progetto dove sono inclusi, sia riusabili;
- Jelly script: linguaggio XML con il quale vengono definiti i goal;
- Plug-in: goal riutilizzabili in tutti i progetti;
- Repository: directory strutturata destinata alla gestione delle librerie. Un repository può essere locale o remoto.
I comandi Maven hanno la seguente struttura:
mvn <nome-plugin>:[<nome_goal>] [{<parametro>}]
I principali plugin disponibili sono i seguenti:
- clean: che permette di cancellare i compilati dal progetto;
- compiler: che permette di compilare i file sorgenti;
- deploy: che permette di depositare il pacchetto generato nel repository remoto;
- install: che permette di depositare il pacchetto generato nel repository locale;
- site: che permette di generare la documentazione del progetto;
- archetype: che permette di generare la struttura di un progetto a partire da un template.
Ciascun plugin mette a disposizione dei goal specifici. Ciascun goal, a sua volta, riceve in ingresso specifici parametri, facoltativi o obbligatori.
Maven permette di creare un progetto a partire da un template che stabilisce la struttura base delle cartelle e dei file che devono essere creati. I principali template disponibili sono i seguenti:
- maven-archetype-archetype;
- maven-archetype-bundles;
- maven-archetype-j2ee-simple;
- maven-archetype-marmalade-mojo;
- maven-archetype-mojo;
- maven-archetype-plugin-site;
- maven-archetype-plugin;
- maven-archetype-portlet;
- maven-archetype-profiles;
- maven-archetype-quickstart;
- maven-archetype-simple;
- maven-archetype-site-simple;
- maven-archetype-site;
- maven-archetype-webapp.
Come esempio d'uso creiamo un semplicissimo progetto Web compatibile con Maven, che quindi mantiene una netta separazione tra i sorgenti java e le pagine Web.
Per creare una struttura (archetype) del progetto bisogna creare una directory che conterrà il progetto stesso (ad esempio C:HtmlMaven) e poi eseguire il comando:
mvn archetype:create
-DgroupId=it.html
-DartifactId=javaModule
-DarchetypeArtifactId=maven-archetype-quickstart
-Dversion=1.0
Con il quale creiamo la seguente struttura per il modulo java:
HtmlMavenjavaModulepom.xml
HtmlMavenjavaModulesrc
HtmlMavenjavaModulesrcmain
HtmlMavenjavaModulesrcmainjava
HtmlMavenjavaModulesrcmainjavait
HtmlMavenjavaModulesrcmainjavaithtml
HtmlMavenjavaModulesrcmainjavaithtmlApp.java
HtmlMavenjavaModulesrctest
HtmlMavenjavaModulesrctestjava
HtmlMavenjavaModulesrctestjavait
HtmlMavenjavaModulesrctestjavaithtml
HtmlMavenjavaModulesrctestjavaithtmlAppTest.java
Poichè abbiamo utilizzato il template maven-archetype-quickstart per generare lo scheletro, viene creata anche una classe di esempio con la corrispondente classe per il test di junit (AppTest.java) che è possibile eliminare.
Infine eseguiamo il comando:
mvn archetype:create
-DgroupId=it.html
-DartifactId=webModule
-DarchetypeArtifactId=maven-archetype-webapp
con il quale creiamo la seguente struttura per il modulo java:
HtmlMavenwebModulepom.xml
HtmlMavenwebModulesrc
HtmlMavenwebModulesrcmain
HtmlMavenwebModulesrcmainresources
HtmlMavenwebModulesrcmainwebapp
HtmlMavenwebModulesrcmainwebappindex.jsp
HtmlMavenwebModulesrcmainwebappWEB-INF
HtmlMavenwebModulesrcmainwebappWEB-INFweb.xml
Come è possibile notare abbiamo due file pom.xml, quindi 2 progetti Maven indipendenti. È necessario adesso creare un terzo progetto composto dai due precedenti: il modulo con il sorgente java e il modulo con il sorgente Web.
Per far ciò inseriamo nella directory principale HtmlMaven un file pom.xml con il seguente contenuto:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<name>Html Maven Project</name>
<modelVersion>4.0.0</modelVersion>
<groupId>it.html</groupId>
<version>1.0</version>
<artifactId>html</artifactId>
<packaging>pom</packaging>
<modules>
<module>javaModule</module>
<module>webModule</module>
</modules>
</project>
Così facendo, quando eseguiremo un comando maven sul progetto principale verrà eseguito anche sui suoi moduli.
Adesso dobbiamo indicare che il modulo Web dipende dal modulo java. Il jar del modulo java deve infatti essere contenuto nelle librerie del war dell'applicazione Web.
Aggiungiamo al file pom.xml del modulo Web nella sezione dependencies, il seguente frammento XML:
<dependency>
<groupId>it.html</groupId>
<artifactId>javaModule</artifactId>
<version>1.0</version>
</dependency>
Adesso supponiamo di voler includere nel nostro progetto la libreria log4j. Per farlo, dobbiamo cercare queste librerie in uno dei repository pubblici, ai quali maven si collega per scaricare tutti i pacchetti di cui necessita, comprese le dipendenze di ciascuno di essi.
Cerchiamo le librerie di cui abbiamo bisogno, ad esempio nel repository ibiblio.
La struttura delle cartelle dei repository, segue la sintassi groupId/arifactId/version.
Per inserire la dipendenza dobbiamo quindi aggiungere:
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.13</version>
</dependency>
Fatto ciò possiamo finalmente compilare il nostro progetto ed ottenere il war pronto per essere deployato.
Spostiamoci nella root del nostro progetto e lanciamo il comando:
mvn install
La prima volta che il progetto viene compilato, maven scarica tutte le librerie dipendenti necessarie alla compilazione. Questa fase è un po' lunga, ma le prestazioni non saranno sempre le stesse. Infatti, le compilazioni successive saranno molto più veloci perchè maven non avrà più bisogno di scaricare dal repository le librerie.
Quando maven avrà finito troveremo nei due moduli una cartella 'target' che contiene l'esito delle compilazioni.
Al termine possiamo notare che ciascun modulo contiene la cartella target con il risultato della compilazione.
Nel modulo Web troviamo il file war pronto per il deploy. Se lo apriamo possiamo notare come nella directory WEB-INF/lib ci siano le due librerie dipendenti, quella relativa al modulo java e quella relativa a log4j.