Apache Maven
Accédez aux informations Maven dans le code
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 votrepom.xml
, une valeur définie dans le fichiersettings.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.
créer un
src/main/resources/info.txt
avec le contenu suivant:version = $ {pom.version} build.date = $ {horodatage}
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>
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>
lancez maven, vous devriez trouver un
info.txt
danstarget/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