Usa l'ultima versione di una dipendenza in Maven

1. Panoramica

L'aggiornamento manuale delle dipendenze di Maven è sempre stato un lavoro noioso, specialmente nei progetti con molte librerie che vengono rilasciate frequentemente.

In questo tutorial impareremo come sfruttare il plug-in Maven delle versioni per mantenere aggiornate le nostre dipendenze .

Soprattutto, questo può essere estremamente utile quando si implementano pipeline di integrazione continua che aggiornano automaticamente le dipendenze, testano che tutto funzioni ancora correttamente e commettono o ripristinano il risultato, a seconda di quale sia appropriato.

2. Sintassi dell'intervallo di versioni di Maven

Ai tempi di Maven2, gli sviluppatori potevano specificare intervalli di versioni entro i quali gli artefatti sarebbero stati aggiornati senza la necessità di un intervento manuale.

Questa sintassi è ancora valida, utilizzata in diversi progetti là fuori e quindi vale la pena conoscerla:

Tuttavia, dovremmo evitarlo a favore del plug-in Versions Maven quando possibile, perché l'avanzamento di versioni concrete dall'esterno ci dà sicuramente più controllo che lasciare che Maven gestisca l'intera operazione da solo.

2.1. Sintassi deprecata

Maven2 ha anche fornito due speciali valori di metaversione per ottenere il risultato: LATEST e RELEASE .

LATEST cerca la versione più recente possibile, mentre RELEASE punta all'ultima versione non SNAPSHOT.

Sono, infatti, ancora assolutamente validi per la risoluzione regolare delle dipendenze .

Tuttavia, questo metodo di aggiornamento legacy causava imprevedibilità laddove CI necessitava di riproducibilità. Quindi, sono stati deprecati per la risoluzione delle dipendenze dei plugin.

3. Versioni Maven Plugin

Il plugin Versions Maven è il modo standard di fatto per gestire la gestione delle versioni al giorno d'oggi.

Dai confronti di alto livello tra repository remoti fino al blocco del timestamp di basso livello per le versioni SNAPSHOT, il suo enorme elenco di obiettivi ci consente di occuparci di ogni aspetto dei nostri progetti che coinvolgono le dipendenze.

Mentre molti di loro sono fuori dallo scopo di questo tutorial, diamo un'occhiata più da vicino a quelli che ci aiuteranno nel processo di aggiornamento.

3.1. Il caso di prova

Prima di iniziare, definiamo il nostro caso di test:

  • tre RELEASE con una versione hardcoded
  • un RILASCIO con una versione della proprietà e
  • un'istantanea
  commons-io commons-io 2.3   org.apache.commons commons-collections4 4.0   org.apache.commons commons-lang3 3.0   org.apache.commons commons-compress ${commons-compress-version}   commons-beanutils commons-beanutils 1.9.1-SNAPSHOT    1.15  

Infine, escludiamo anche un artefatto dal processo quando definiamo il plugin:

   org.codehaus.mojo versions-maven-plugin 2.7   org.apache.commons:commons-collections4      

4. Visualizzazione degli aggiornamenti disponibili

Prima di tutto, per sapere semplicemente se e come possiamo aggiornare il nostro progetto, lo strumento giusto per il lavoro sono le versioni: display-dependency-updates :

mvn versions:display-dependency-updates

Come possiamo vedere, il processo includeva ogni versione RELEASE. Comprendeva anche commons-collections4 poiché l'esclusione nella configurazione si riferisce al processo di aggiornamento e non a quello di discovery.

Al contrario, ha ignorato SNAPSHOT, perché è una versione di sviluppo che spesso non è sicura da aggiornare automaticamente.

5. Aggiornamento delle dipendenze

Quando si esegue un aggiornamento per la prima volta, il plugin crea un backup del pom.xml denominato pom.xml.versionsBackup .

Sebbene ogni iterazione altererà il pom.xml , il file di backup conserverà lo stato originale del progetto fino al momento in cui l'utente eseguirà il commit (tramite mvn versions: commit ) o ripristinerà (tramite mvn versions: revert ) l'intero processo.

5.1. Conversione di SNAPSHOT in RELEASE

A volte capita che un progetto includa uno SNAPSHOT (una versione che è ancora in fase di sviluppo pesante).

Possiamo usare versioni: use-releases per verificare se la RELEASE corrispondente è stata pubblicata, e ancora di più per convertire la nostra SNAPSHOT in quella RELEASE allo stesso tempo:

mvn versions:use-releases 

5.2. Aggiornamento alla prossima versione

Possiamo portare ogni dipendenza non SNAPSHOT alla sua versione più vicina con le versioni: use-next-releases :

mvn versions:use-next-releases 

Possiamo vedere chiaramente che il plugin ha aggiornato commons-io , commons-lang3 e persino commons-beanutils , che non è più uno SNAPSHOT, alla loro prossima versione.

Ancora più importante, ha ignorato c ommons-collections4 , che è escluso nella configurazione del plugin, e commons-compress , che ha un numero di versione specificato dinamicamente tramite una proprietà.

5.3. Aggiornamento all'ultima VERSIONE

L'aggiornamento di ogni dipendenza non SNAPSHOT alla sua ultima versione funziona allo stesso modo, semplicemente cambiando l'obiettivo in versioni: use-latest-releases :

mvn versions:use-latest-releases 

6. Filtering out Unwanted Versions

In case we want to ignore certain versions, the plugin configuration can be tuned to dynamically load rules from an external file:

 org.codehaus.mojo versions-maven-plugin 2.7  //www.mycompany.com/maven-version-rules.xml   

Most noteworthy, can also refer to a local file:

file:///home/andrea/maven-version-rules.xml 

6.1. Ignoring Versions Globally

We can configure our rules file so that it'll ignore versions matching a specific Regular Expression:

  .*-beta   

6.2. Ignoring Versions on a Per-Rule Basis

Finally, in case our needs are more specific, we can build a set of rules instead:

    .*-RELEASE 2.1.0     

7. Conclusion

We've seen how to check and update the dependencies of a project in a safe, automatic, and Maven3-compliant way.

As always, the source code is available over on GitHub, along with a script to help showcase everything step-by-step and without complexity.

Per vederlo in azione, è sufficiente scaricare il progetto ed eseguirlo in un terminale (o in Git Bash se si utilizza Windows):

./run-the-demo.sh