maven version rules eenvoudig delen tussen projecten

it-rockstar sven haster

Na enig experimenteren vond ik vorige week de oplossing voor een probleem waar ik al vaker mee had gestoeid: hoe kan ik vanuit verschillende projecten de maven versions plugin gebruiken om te controleren of er nieuwere versies van dependencies zijn met voor elk project dezelfde version rules.

Zoals het een goede maven-gebruiker betaamt heb ik het beheer van mijn dependencies en plugins gecentraliseerd in een parent pom zodat elk child project dezelfde setup en plugins gebruikt. Hoe kan ik de version rules voor de versions-maven-plugin op een vergelijkbare manier centraliseren zodat elk child project dezelfde regels gebruikt?

De oplossing blijkt uiteindelijk vrij simpel: zoals vermeld in de documentatie voor de plugin kun je de version rules in een Java artefact stoppen en de versions plugin vervolgens zó configureren dat deze dit artefact gebruikt:

Maak hiervoor eerst een map aan voor je nieuwe artefact (maven project) met de volgende indeling:

version-rules

   |- files

      \-version-rules.xml

   \- pom.xml

 

Hierbij bevat de version-rules.xml de door jou gebruikte version rules die je wilt delen. De pom.xml is een basismodelletje dat niet veel meer doet dan een jar maken met de inhoud van de files-map:

<?xml version="1.0" encoding="UTF-8"?>

<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">

   <modelVersion>4.0.0</modelVersion>

 

   <groupId>org.example</groupId>

   <artifactId>my-version-rules</artifactId>

   <version>1.0-SNAPSHOT</version>

   <packaging>jar</packaging>

  

   <name>My version rules</name>

 

   <build>

      <defaultGoal>package</defaultGoal>

      <resources>

         <resource>

            <directory>files</directory>

            <filtering>false</filtering>

            <includes>

               <include>**/*</include>

            </includes>

         </resource>

      </resources>

      <plugins>

         <plugin>

            <groupId>org.apache.maven.plugins</groupId>

            <artifactId>maven-jar-plugin</artifactId>

         </plugin>

      </plugins>

   </build>

</project>

 

Draai mvn install in deze map om de jar te maken en in je lokale maven repository te installeren.

Open vervolgens de pom waarin je deze regels wilt gebruiken. Configureer de versions-maven-plugin zo dat deze een dependency heeft op je zojuist aangemaakte version-rules artefact en op zijn classpath zoekt naar je version-rules.xml :

 

<?xml version="1.0" encoding="UTF-8"?>

<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">

   <modelVersion>4.0.0</modelVersion>

 

   <groupId>org.example</groupId>

   <artifactId>my-project</artifactId>

   <version>1.0-SNAPSHOT</version>

   <packaging>jar</packaging>

  

   <name>My version rules</name>

   <build>

      <pluginManagement>

         <plugins>

            <plugin>

               <groupId>org.codehaus.mojo</groupId>

               <artifactId>versions-maven-plugin</artifactId>

               <version>2.7</version>

               <configuration>

                  <rulesUri>classpath:///version-rules.xml</rulesUri>

               </configuration>

               <dependencies>

                  <dependency>

                     <groupId>org.example</groupId>

                     <artifactId>my-version-rules</artifactId>

                     <version>1.0-SNAPSHOT</version>

                  </dependency>

               </dependencies>

            </plugin>

         </plugins>

      </pluginManagement>

   </build>

</project>

 

Et voilà, als je nu in my-project het commando
mvn versions:display-dependency-updatesdraait, gebruikt dit de version-rules.xml uit je my-version-rules artefact. Vergeet niet om na elke wijziging aan de version rules opnieuw te draaien op je my-version-rules project, anders worden deze wijzigingen niet meegenomen.

Voor mijn persoonlijke projecten wordt de versions-maven-plugin beheerd in de parent pom die gedeeld wordt door alle projecten. Ik heb het version-rules artefact als submodule van deze parent pom opgezet, wat betekent dat het altijd samen met de parent wordt gebouwd en gereleaset. Op deze manier gebruiken alle child projects dezelfde version rules en krijgen ze updates op deze regels mee samen met de andere updates van een nieuwe parent pom.