Récupérer la version de Maven pom.xml dans le code
Quel est le moyen le plus simple de récupérer le numéro de version du pom de maven.xml dans le code, c'est à dire, par programmation?
7 réponses
En supposant que vous utilisez Java, vous pouvez
Créez un fichier
.properties
dans (le plus souvent) votre répertoiresrc/main/resources
(mais à l'étape 4, Vous pouvez lui dire de regarder ailleurs).Définissez la valeur d'une propriété dans votre fichier
.properties
à l'aide de la propriété Maven standard pour la version du projet:foo.bar=${project.version}
Dans votre code Java, chargez la valeur du fichier de propriétés en tant que ressource à partir du classpath (google pour de nombreux exemples de la façon de le faire, mais Voici un exemple pour les démarreurs ).
-
Dans Maven, activez le filtrage des ressources - cela entraînera Maven à copier ce fichier dans vos classes de sortie et à traduire la ressource pendant cette copie, en interprétant la propriété. Vous pouvez trouver quelques informations ici mais vous le faites surtout dans votre pom:
<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build>
, Vous pouvez également obtenir d'autres propriétés standard comme project.name
, project.description
, ou même des propriétés arbitraires que vous mettez dans votre pom <properties>
, etc. Filtrage des ressources, combiné avec les profils Maven, peut vous donner un comportement de construction variable au moment de la construction. Lorsque vous spécifiez un profil à l'exécution avec -PmyProfile
, cela peut activer les propriétés qui peuvent ensuite apparaître dans votre build.
Les artefacts empaquetés contiennent un fichier META-INF/maven/${groupId}/${artifactId}/pom.properties
dont le contenu ressemble:
#Generated by Maven
#Sun Feb 21 23:38:24 GMT 2010
version=2.5
groupId=commons-lang
artifactId=commons-lang
De nombreuses applications utilisent ce fichier pour lire la version de l'application / jar à l'exécution, il n'y a aucune configuration requise.
Le seul problème avec l'approche ci-dessus est que ce fichier est (actuellement) généré pendant la phase package
et ne sera donc pas présent lors des tests, etc (il y a un problème Jira pour changer cela, voir MJAR-76). Si c'est un problème pour vous, alors l'approche décrite par Alex le chemin à parcourir.
La réponse acceptée peut être la meilleure et la plus stable façon d'obtenir un numéro de version dans une application statiquement, mais ne répond pas réellement à la question initiale: comment récupérer le numéro de version de l'artefact de pom.xml? Ainsi, je veux offrir une alternative montrant comment le fairedynamiquement pendant l'exécution:
Vous pouvez utiliser Maven lui-même. Pour être plus exact, vous pouvez utiliser une bibliothèque Maven.
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-model</artifactId>
<version>3.3.9</version>
</dependency>
Et puis faites quelque chose comme ça dans Java:
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 Application {
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
Mise à jour 2017-10-31: afin de répondre à la question de suivi de Simon Sobisch, j'ai modifié l'exemple comme ceci:
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.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Application {
public static void main(String[] args) throws IOException, XmlPullParserException {
MavenXpp3Reader reader = new MavenXpp3Reader();
Model model;
if ((new File("pom.xml")).exists())
model = reader.read(new FileReader("pom.xml"));
else
model = reader.read(
new InputStreamReader(
Application.class.getResourceAsStream(
"/META-INF/maven/de.scrum-master.stackoverflow/aspectj-introduce-method/pom.xml"
)
)
);
System.out.println(model.getId());
System.out.println(model.getGroupId());
System.out.println(model.getArtifactId());
System.out.println(model.getVersion());
}
}
Il existe également la méthode décrite dans Un moyen facile d'afficher le numéro de version de vos applications en utilisant Maven :
Ajoutez ceci à pom.xml
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>test.App</mainClass>
<addDefaultImplementationEntries>
true
</addDefaultImplementationEntries>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
Ensuite, utilisez ceci:
App.class.getPackage().getImplementationVersion()
J'ai trouvé cette méthode plus simple.
Pour compléter ce que @ kieste a posté, ce qui, je pense, est le meilleur moyen d'avoir des informations de construction Maven disponibles dans votre code si vous utilisez Spring-boot: la documentation à http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#production-ready-application-info est très utile.
, Vous avez juste besoin d'activer les actionneurs, et ajouter les propriétés dont vous avez besoin dans votre application.properties
ou application.yml
Automatic property expansion using Maven
You can automatically expand info properties from the Maven project using resource filtering. If you use the spring-boot-starter-parent you can then refer to your Maven ‘project properties’ via @..@ placeholders, e.g.
project.artifactId=myproject
project.name=Demo
project.version=X.X.X.X
project.description=Demo project for info endpoint
info.build.artifact=@project.artifactId@
info.build.name=@project.name@
info.build.description=@project.description@
info.build.version=@project.version@
Si vous utilisez un packaging mvn tel que jar ou war, utilisez:
getClass().getPackage().getImplementationVersion()
Il lit une propriété "implémentation-Version" du META-INF/MANIFEST généré.MF (qui est réglé sur le pom.version xml) dans l'archive.
Utilisez cette bibliothèque pour la facilité d'une solution simple. Ajoutez au manifeste tout ce dont vous avez besoin, puis interrogez par chaîne.
System.out.println("JAR was created by " + Manifests.read("Created-By"));