Strumenti Utente

Strumenti Sito


documentazione_3di_riservata:manuali_sviluppo:maven

Differenze

Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.

Link a questa pagina di confronto

Entrambe le parti precedenti la revisioneRevisione precedente
Prossima revisione
Revisione precedente
documentazione_3di_riservata:manuali_sviluppo:maven [2015/08/25 16:57] aalberghinidocumentazione_3di_riservata:manuali_sviluppo:maven [Data sconosciuta] (versione attuale) – eliminata - modifica esterna (Data sconosciuta) 127.0.0.1
Linea 1: Linea 1:
-====== Introduzione a maven ====== 
- 
-Maven è uno strumento nato per gestire i progetti Java. È in grado di occuparsi, se opportunamente configurato, della risoluzione delle dipendenze, della compilazione, dell'esecuzione dei test, della generazione degli artefatti, della reportistica, della documentazione del progetto e molto altro. 
-Il progetto maven dispone di un [[http://mvnrepository.com/ | repository pubblico centralizzato]] sul quale vengono caricati gli artefatti di diversi progetti (tipo apache-commons, log4j ecc.) che possono essere dichiarati come dipendenze del proprio progetto, facendo in modo che maven risolva la catena di dipendenze e scarichi in autonomia quanto gli è necessario per eseguire la build. 
- 
-===== Repository maven ===== 
- 
-I repository maven ospitano i vari artefatti dei vari gruppi e permettono il reperimento delle dipendenze specificate nel descrittore del progetto (pom.xml). Come accennato nel paragrafo precedente, esistono repository pubblici e privati centralizzati dai quali scaricare gli artefatti ma anche __repository locali__ creati ed utilizzati in automatico da maven su ogni macchina quando scarica un artefatto da una fonte esterna. Il repository locale è solitamente posto all'interno della propria M2_HOME (''${HOME}/.m2/settings.xml'' su Mac/Linux o''%USERPROFILE%/.m2/settings.xml'' su Windows) e funge da cache dei pacchetti reperiti dalle fonti esterne. 
- 
-===== Progetti, artefatti, SNAPSHOT e file pom.xml ===== 
- 
-Ogni progetto è identificato dai seguenti 2 parametri: 
- 
-  * groupId 
-  * artifactId 
- 
-Il primo è un identificativo univoco del produttore del software (per esempio, org.apache per la Apache Software Foundation), mentre l'artifactId identifica il singolo artefatto/progetto del gruppo (per esempio, commons per il progetto Commons della Apache Software Foundation). 
- 
-Ogni artefatto ha __necessariamente__ un numero di versione, per esempio 1.0.0. È possibile apporre il suffisso "-SNAPSHOT" al normale numero di versione per indicare a maven che la versione non è da ritenersi ancora stabile. Contrariamente agli altri artefatti dotati di numero di versione stabile (senza SNAPSHOT, in pratica), maven permette di __aggiornare__ gli artefatti SNAPSHOT: questo significa che scaricare lo stesso artefatto con la stessa versione SNAPSHOT in due momenti diversi potrebbe produrre risultati differenti, poiché l'artefatto potrebbe essere stato aggiornato nel mentre. 
- 
-Tutte queste informazioni (e molte altre) vengono immesse nel file **pom.xml** presente nella root directory del progetto, che rappresenta il modello del progetto e conterrà tutti i metadati necessari a maven per risolvere le dipendenze, compilarlo, eseguire i test, ecc. 
- 
-===== Build lifecycle e goals=====  
- 
-Il concetto di build di un progetto in maven è concepito come un "build lifecycle", ovvero un processo ben definito e standard per creare gli artefatti del progetto. Il lifecycle **default** comprende, tra gli [[https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Lifecycle_Reference | altri]], i seguenti passaggi: 
-  - validate 
-  - compile 
-  - test 
-  - package 
-  - integration-test 
-  - verify 
-  - install 
- 
-Essendo il processo già noto e ben definito, il pom.xml non serve ad altro se non a specificare i parametri necessari ad eseguire tutte le varie fasi dei lifecycle. 
- 
-Nel caso in cui ci si appoggi a plugin aggiuntivi per creare gli artefatti del proprio progetto, è probabile che questi presentino dei loro step aggiuntivi che vanno ad aggiungersi ai passi della normale build: questi step prendono il nome di goal e si specificano solitamente nella forma **nome_plugin:nome_goal**. Un esempio può essere il seguente: 
-<code> 
-mvn clean dependency:copy-dependencies package 
-</code> 
-nel quale si indica a maven di eseguire il passo **clean**, seguito dal goal **copy-dependencies** del plugin **dependency**, seguito poi dal passo **package**. 
- 
- 
-Per ulteriori approfondimenti, consultare la sezione [[documentazione_3di_riservata:manuali_sviluppo:maven#riferimenti_esterni|riferimenti esterni]] in coda alla pagina. 
- 
- 
-====== Sonatype Nexus ====== 
- 
-[[http://www.sonatype.org/nexus/ | Nexus]] è un'applicazione web che consente, tra le altre cose, la creazione e la gestione di un repository maven accessibile tramite web. Oltre alla possibilità di caricare i propri artefatti e renderli disponibili ad altri, può essere configurato anche come cache-server del [[http://mvnrepository.com/ | repository centrale di maven]], rendendo più efficienti i processi di build in ambiti di reti locali. 
- 
-Un'istanza della versione Open (OSS) di Nexus è stata installata sul server ecatonchiro.bo.priv, ed è raggiungibile alla seguente [[http://ecatonchiro.bo.priv:8081/nexus | URL ]]. 
- 
-====== Configurazione di maven ====== 
- 
-Per potersi appoggiare al nostro server Nexus, è necessario configurare maven in modo da istruirlo su dove reperire gli artefatti. Per farlo è sufficiente modificare (o creare, se non già esistente) il file ''${HOME}/.m2/settings.xml'' (''%USERPROFILE%/.m2/settings.xml'' su Windows) col seguente contenuto: 
- 
-<code xml settings.xml> 
-<?xml version="1.0"?> 
-<settings> 
-  <servers> 
-    <server> 
-      <id>deployment</id> 
-      <username>USERNAME</username> 
-      <password>PASSWORD</password> 
-    </server> 
-  </servers> 
-  <mirrors> 
-    <mirror> 
-      <!--This sends everything else to /public --> 
-      <id>nexus</id> 
-      <mirrorOf>*</mirrorOf> 
-      <url>http://ecatonchiro:8081/nexus/content/groups/public</url> 
-    </mirror> 
-    <mirror> 
-      <id>nexus_releases</id>                                                                                                                                                                                          
-      <mirrorOf>*</mirrorOf>                                                                                                                                                                                           
-      <url>http://ecatonchiro:8081/nexus/content/repositories/releases/</url>                                                                                                                                          
-    </mirror>                                                                                                                                                                                                          
-    <mirror>                                                                                                                                                                                                           
-      <id>nexus_snapshots</id>                                                                                                                                                                                         
-      <mirrorOf>*</mirrorOf>                                                                                                                                                                                           
-      <url>http://ecatonchiro:8081/nexus/content/repositories/snapshots/</url>                                                                                                                                         
-    </mirror>                                                                                                                                                                                                          
-  </mirrors>                                                                                                                                                                                                           
-  <profiles>                                                                                                                                                                                                           
-    <profile> 
-      <id>nexus</id> 
-      <!--Enable snapshots for the built in central repo to direct --> 
-      <!--all requests to nexus via the mirror --> 
-      <repositories> 
-        <repository> 
-          <id>central</id> 
-          <url>http://central</url> 
-          <releases> 
-            <enabled>true</enabled> 
-          </releases> 
-          <snapshots> 
-            <enabled>true</enabled> 
-          </snapshots> 
-        </repository> 
-      </repositories> 
-      <pluginRepositories> 
-        <pluginRepository> 
-          <id>central</id> 
-          <url>http://central</url> 
-          <releases> 
-            <enabled>true</enabled> 
-          </releases> 
-          <snapshots> 
-            <enabled>true</enabled> 
-          </snapshots> 
-        </pluginRepository> 
-      </pluginRepositories> 
-    </profile> 
-  </profiles> 
-  <activeProfiles> 
-    <!--make the profile active all the time --> 
-    <activeProfile>nexus</activeProfile> 
-  </activeProfiles> 
-</settings> 
-</code> 
- 
-Come si può notare, è anche presente una sezione deployment all'inzio del file: immettendo le proprie credenziali LDAP al posto di USERNAME e PASSWORD, sarà possibile eseguire __direttamente__ il deploy degli artefatti sul nostro repository Nexus((a patto di aver immesso un'apposita sezione ''<deployment>'' nel pom.xml del progetto)) specificando il lifecycle **deploy** durante la build, e.g: 
-<code> 
-mvn deploy 
-</code> 
- 
-====== Configurazione del progetto - pom.xml ====== 
- 
-===== Configurazione per il deployment ===== 
- 
-Per poter effettuare direttamente il deploy degli artefatti di un progetto tramite maven, è necessario aggiungere la seguente specifica all'interno dell'elemento radice ''<project>'': 
-<code xml> 
-<distributionManagement> 
- <repository> 
- <id>deployment</id> 
- <name>Internal Releases</name> 
- <url>http://ecatonchiro:8081/nexus/content/repositories/releases/</url> 
- </repository> 
- <snapshotRepository> 
- <id>deployment</id> 
- <name>Internal Releases</name> 
- <url>http://ecatonchiro:8081/nexus/content/repositories/snapshots/</url> 
- </snapshotRepository> 
-</distributionManagement> 
-</code> 
- 
-Se si sono specificate le proprie credenziali nel file ''settings.xml'' e se si dispone dei diritti necessari su Nexus, allora il comando ''mvn deploy'' invierà l'artefatto prodotto nella fase di installazione al nostro repository centralizzato, rendendolo disponibile a tutti. 
- 
-===== Altre configurazioni utili ===== 
- 
-==== Properties ==== 
- 
-Per specificare delle property, magari richieste da un qualche plugin per abilitare delle funzionalità aggiuntive, è possibile specificarle all'interno di un element ''<properties>'' posto all'interno di ''<project>''. 
- 
-Ad esempio, per specificare di considerare i sorgenti come codificati in ISO-8859-1 invece di UTF-8 durante la build: 
- 
-<code xml> 
-<properties> 
-   <project.build.sourceEncoding>ISO-8859-1</project.build.sourceEncoding> 
-</properties> 
-</code> 
- 
-==== Configurazione delle dipendenze ==== 
- 
-Le dipendenze vanno specificate all'interno dell'elemento ''<dependencies>'' posto direttamente sotto l'elemento ''<project>''. Le dipendenze possono essere di vario tipo, per esempio dipendenze di compilazione semplice, dipendenze di test (per poter eseguire correttamente i test) ecc. 
-Un esempio di elemento ''<dependencies>'' utilizzato all'interno del progetto hj è il seguente: 
- 
-<code xml> 
-<dependencies> 
- <dependency> 
- <groupId>org.apache.directory.studio</groupId> 
- <artifactId>org.apache.commons.codec</artifactId> 
- <version>1.6</version> 
- </dependency> 
- <dependency> 
- <groupId>log4j</groupId> 
- <artifactId>log4j</artifactId> 
- <version>1.2.8</version> 
- </dependency> 
- <dependency> 
- <groupId>xerces</groupId> 
- <artifactId>xercesImpl</artifactId> 
- <version>2.7.1</version> 
- </dependency> 
- <dependency> 
- <groupId>com.sun.mail</groupId> 
- <artifactId>javax.mail</artifactId> 
- <version>1.5.4</version> 
- </dependency> 
- <dependency> 
- <groupId>it.tredi</groupId> 
- <artifactId>configurator</artifactId> 
- <version>1.0.0</version> 
- </dependency> 
-</dependencies> 
-</code> 
- 
-====== Riferimenti esterni ====== 
- 
-[[http://mvnrepository.com/ | Repository centrale di maven]] 
- 
-[[https://maven.apache.org/what-is-maven.html | Documentazione ufficiale di maven]] 
- 
-[[https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html | Introduzione ai lifecycle di maven ]] 
- 
-[[http://www.sonatype.org/nexus/ | Sito web di Sonatype Nexus]] 
- 
-[[http://ecatonchiro.bo.priv:8081/nexus/| Sito del repository Nexus 3DI]] 
- 
- 
  
/data/attic/documentazione_3di_riservata/manuali_sviluppo/maven.1440514629.txt.gz · Ultima modifica: (modifica esterna)