Gestione della Versione in un Progetto Maven Multimodulo

Le informazioni che identificano un univocamente progetto Maven, sia esso un progetto singolo o un modulo di un progetto più ampio, sono: groupId, artifactId e version. Se non diversamente specificato valorizzando la proprietà <fileName> nella sezione <build>, le proprietà artifactId e version contribuiscono alla definizione del nome dell’artefatto che la fase di package produce, secondo l’espressione: ${artifactId}-${version}.

In questo breve articolo mostriamo come sia semplice uniformare il numero di versione su tutti gli artefatti prodotti dai diversi moduli di un progetto Maven. Sfortunatamente, infatti, i moduli non ereditano il numero di versione dal progetto principale, abbiamo quindi la necessità di definire una proprietà visibile a tutti sotto-progetti.

Il Problema

Consideriamo un semplice progetto composto da due soli moduli: module_a e module_b, come mostrato nell’immagine seguente.

Se eseguiamo il package del progetto Maven genererà due artefatti, uno per ciascun modulo, che avranno nome:

  • module_a-[versione modulo a]
  • module_b-[versione modulo b]

dove [versione modulo a/b] è il numero di versione definito nei rispettivi file pom.xml. Mantenere il numero di versione nel nome dell’artefatto è, in generale, una buona pratica, perchè ci consente di avere un maggiore controllo sulla gestione del processo di deploy.

Supponiamo di avere due artefatti, un EAR ed un WAR, che vengono installati su un Application Server e di voler conoscere quale sia la versione deployata dell’applicativo. Con una rapida ispezione visiva siamo in grado di dare una risposta certa. Quando però dobbiamo eseguire il deploy di una nuova versione dobbiamo modificare la proprietà <version> su tutti i pom.xml del progetto, operazione che può risultare tediosa, se i moduli sono parecchi, e suscettibile di errore umano.

La Soluzione

La soluzione, come accennavamo nell’introduzione, è quella di utilizzare una proprietà definita nel pom.xml del progetto principale ed utilizzare tale proprietà in tutti i tag <version> di tutti i pom, anche in quello del progetto padre, come mostrato di seguito.

Progetto Principale
module_a module_b

Se eseguiamo ora il package del progetto il risultato sarà di avere tutti gli artefatti con lo stesso numero di versione, come mostrato in figura.

Codice Sorgente

Il codice sorgente completo è scaricabile qui: maven-version.