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?

184
demandé sur Hamedz 2010-09-13 05:36:09

7 réponses

En supposant que vous utilisez Java, vous pouvez

  1. Créez un fichier .properties dans (le plus souvent) votre répertoire src/main/resources (mais à l'étape 4, Vous pouvez lui dire de regarder ailleurs).

  2. 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}

  3. 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 ).

  4. 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.

200
répondu Alex Miller 2017-06-29 02:54:57

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.

65
répondu Pascal Thivent 2010-09-13 07:46:30

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());
  }
}
51
répondu kriegaex 2017-10-31 12:51:17

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.

35
répondu adam.lofts 2014-12-08 19:19:53

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@
15
répondu coolnodje 2016-04-12 10:57:34

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.

12
répondu electrobabe 2015-05-13 14:17:29

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

Http://manifests.jcabi.com/index.html

6
répondu feder 2014-04-21 07:34:05