Recherche…


Introduction

Il est parfois utile d’obtenir les propriétés Maven, telles que la version actuelle, dans le code. Voici quelques moyens d'y parvenir.

Obtenir le numéro de version depuis un pot

Si vous empaquetez votre application dans un jar à l'aide du maven-jar-plugin ou du maven-jar-plugin maven-assembly-plugin , un moyen simple d'obtenir la version actuelle de pom consiste à ajouter une entrée dans le manifeste, qui est alors disponible à partir de Java.

Le secret est de définir l'indicateur addDefaultImplementationEntries sur true (et l' addDefaultSpecificationEntries vous avez également besoin de l'ID d'artefact).

Configuration du plugin jar :

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <configuration>
        <archive>
          <manifest>
            <mainClass>...</mainClass>
            <addDefaultImplementationEntries>
              true
            </addDefaultImplementationEntries>
          </manifest>
        </archive>
      </configuration>
    </plugin>
  </plugins>
</build>

Configuration du plugin d'assemblage :

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <archive>
            <manifest>  
              <addDefaultImplementationEntries>true</addDefaultImplementationEntries> 
            </manifest>
        </archive>
    </configuration>
    <executions>
        <execution .../>
    </executions>
</plugin>

addDefaultImplementationEntries demande à Maven d'ajouter les en-têtes suivants au MANIFEST.MF de votre MANIFEST.MF jar:

Implementation-Title: display-version
Implementation-Version: 1.0-SNAPSHOT
Implementation-Vendor-Id: test

Vous pouvez maintenant utiliser cette ligne de code n'importe où dans votre fichier jar pour accéder au numéro de version:

getClass().getPackage().getImplementationVersion()

Plus d'informations ici et ici .

Garder un fichier de propriétés en synchronisation en utilisant le mécanisme de filtrage des propriétés de maven

Comme l'explique cette documentation ,

Parfois, un fichier de ressources doit contenir une valeur qui ne peut être fournie qu'au moment de la construction. Pour ce faire, placez une référence à la propriété qui contiendra la valeur dans votre fichier de ressources en utilisant la syntaxe ${<property name>} . La propriété peut être l'une des valeurs définies dans votre pom.xml , une valeur définie dans le fichier settings.xml l'utilisateur, une propriété définie dans un fichier de propriétés externe ou une propriété système.

A titre d'exemple, créons un simple info.txt dans src/main/resources contenant la version de pom et le temps de compilation.

  1. créer un src/main/resources/info.txt avec le contenu suivant:

    version = $ {pom.version} build.date = $ {horodatage}

  2. demander à Maven d' étendre les propriétés en définissant le filtering sur true:

     <build>
         <resources>
             <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
             </resource>
         </resources>
     </build>
    
  3. avec cela, la version sera mise à jour, mais malheureusement un bogue dans Maven empêche la propriété ${maven.build.timestamp} d'être transmise au mécanisme de filtrage des ressources (plus d'informations ici ). Alors, créons une propriété d' timestamp comme solution de contournement! Ajoutez ce qui suit aux propriétés de pom:

     <properties>
         <timestamp>${maven.build.timestamp}</timestamp>
         <maven.build.timestamp.format>yyyy-MM-dd'T'HH:mm</maven.build.timestamp.format>  
     </properties>
    
  4. lancez maven, vous devriez trouver un info.txt dans target/classes avec un contenu comme:

     version=0.3.2
     build.date=2017-04-20T13:56
    

Lecture d'un fichier pom.xml à l'exécution à l'aide du plugin maven-model

Les autres exemples peuvent être le meilleur moyen et le plus stable d'obtenir un numéro de version dans une application de manière statique . Cette réponse propose une alternative montrant comment le faire dynamiquement pendant l'exécution, en utilisant la bibliothèque maven maven-model .

Ajoutez la dépendance:

<dependency>
  <groupId>org.apache.maven</groupId>
  <artifactId>maven-model</artifactId>
  <version>3.3.9</version>
</dependency>

En Java, créez un MavenXpp3Reader pour lire votre pom. Par exemple:

package de.scrum_master.app;

import org.apache.maven.model.Model;
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;

import java.io.FileReader;
import java.io.IOException;

public class MavenModelExample {
    public static void main(String[] args) throws IOException, XmlPullParserException {
        MavenXpp3Reader reader = new MavenXpp3Reader();
        Model model = reader.read(new FileReader("pom.xml"));
        System.out.println(model.getId());
        System.out.println(model.getGroupId());
        System.out.println(model.getArtifactId());
        System.out.println(model.getVersion());
    }
}

Le journal de la console est le suivant:

de.scrum-master.stackoverflow:my-artifact:jar:1.0-SNAPSHOT
de.scrum-master.stackoverflow
my-artifact
1.0-SNAPSHOT


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow