Verwenden Sie die neueste Version einer Abhängigkeit in Maven

1. Übersicht

Das manuelle Aktualisieren von Maven-Abhängigkeiten war schon immer eine mühsame Arbeit, insbesondere in Projekten, in denen viele Bibliotheken häufig veröffentlicht werden.

In diesem Tutorial erfahren Sie, wie Sie das Versions Maven Plugin nutzen, um unsere Abhängigkeiten auf dem neuesten Stand zu halten .

Dies kann vor allem bei der Implementierung von Continuous Integration-Pipelines, die die Abhängigkeiten automatisch aktualisieren, testen, ob alles noch ordnungsgemäß funktioniert, und beim Festschreiben oder Zurücksetzen des Ergebnisses, je nachdem, was angemessen ist, äußerst nützlich sein.

2. Maven-Versionsbereichssyntax

In den Maven2-Tagen konnten Entwickler Versionsbereiche angeben, in denen die Artefakte ohne manuellen Eingriff aktualisiert worden wären.

Diese Syntax ist immer noch gültig, wird in mehreren Projekten verwendet und ist daher wissenswert:

Wir sollten es jedoch nach Möglichkeit zugunsten des Versions Maven Plugins vermeiden, da wir durch die Weiterentwicklung konkreter Versionen von außen definitiv mehr Kontrolle haben, als Maven den gesamten Vorgang alleine abwickeln zu lassen.

2.1. Veraltete Syntax

Maven2 lieferte außerdem zwei spezielle Metaversionswerte, um das Ergebnis zu erzielen: LATEST und RELEASE .

LATEST sucht nach der neuesten möglichen Version, während RELEASE auf die neueste Nicht-SNAPSHOT-Version abzielt.

Sie sind in der Tat immer noch absolut gültig für die regelmäßige Auflösung von Abhängigkeiten .

Diese ältere Upgrade-Methode verursachte jedoch Unvorhersehbarkeit, wenn CI Reproduzierbarkeit benötigte. Daher sind sie für die Auflösung von Plugin-Abhängigkeiten veraltet.

3. Versionen Maven Plugin

Das Versions Maven Plugin ist heutzutage de facto die Standardmethode für die Versionsverwaltung.

Von Vergleichen auf hoher Ebene zwischen Remote-Repositorys bis hin zu Sperren von Zeitstempeln auf niedriger Ebene für SNAPSHOT-Versionen ermöglicht die umfangreiche Liste von Zielen, dass wir uns um jeden Aspekt unserer Projekte kümmern, der Abhängigkeiten beinhaltet.

Während viele von ihnen nicht in den Rahmen dieses Tutorials fallen, schauen wir uns diejenigen genauer an, die uns beim Upgrade-Prozess helfen.

3.1. Der Testfall

Bevor wir beginnen, definieren wir unseren Testfall:

  • drei RELEASEs mit einer fest codierten Version
  • eine FREIGABE mit einer Eigenschaftsversion und
  • ein SNAPSHOT
  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  

Lassen Sie uns zum Schluss auch ein Artefakt aus dem Prozess ausschließen, wenn Sie das Plugin definieren:

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

4. Verfügbare Updates anzeigen

Zunächst einmal einfach zu wissen , ob und wie wir unser Projekt aktualisieren, das richtige Werkzeug für den Job Versionen: Anzeige Abhängigkeit-Updates :

mvn versions:display-dependency-updates

Wie wir sehen können, umfasste der Prozess jede RELEASE-Version. Es enthielt sogar commons-collection4, da sich der Ausschluss in der Konfiguration auf den Aktualisierungsprozess bezieht und nicht auf den Erkennungsprozess.

Im Gegensatz dazu wurde der SNAPSHOT ignoriert, da es sich um eine Entwicklungsversion handelt, deren automatische Aktualisierung häufig nicht sicher ist.

5. Aktualisieren der Abhängigkeiten

When running an update for the first time, the plugin creates a backup of the pom.xml named pom.xml.versionsBackup.

While every iteration will alter the pom.xml, the backup file will preserve the original state of the project up to the moment the user will commit (through mvn versions:commit) or revert (through mvn versions:revert) the whole process.

5.1. Converting SNAPSHOTs into RELEASEs

It happens sometimes that a project includes a SNAPSHOT (a version which is still under heavy development).

We can use versions:use-releases to check if the correspondent RELEASE has been published, and even more to convert our SNAPSHOT into that RELEASE at the same time:

mvn versions:use-releases 

5.2. Updating to the Next RELEASE

We can port every non-SNAPSHOT dependency to its nearest version with versions:use-next-releases:

mvn versions:use-next-releases 

We can clearly see that the plugin updated commons-io, commons-lang3, and even commons-beanutils, which is not a SNAPSHOT anymore, to their next version.

Most importantly, it ignored commons-collections4, which is excluded in the plugin configuration, and commons-compress, which has a version number specified dynamically through a property.

5.3. Updating to the Latest RELEASE

Updating every non-SNAPSHOT dependency to its latest release works in the same way, simply changing the goal to versions: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.

Um es in Aktion zu sehen, laden Sie einfach das Projekt herunter und führen Sie es in einem Terminal aus (oder in Git Bash, wenn Sie Windows verwenden):

./run-the-demo.sh