web-dev-qa-db-fra.com

Récupère 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 de pom.xml de maven dans le code, c’est-à-dire par programme?

196
mikhail

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 pourriez lui demander de regarder ailleurs).

  2. Définissez la valeur d'une propriété dans votre fichier .properties à l'aide de la propriété standard Maven 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 du chemin de classe (google pour de nombreux exemples de la procédure à suivre, mais voici un exemple pour les débutants ).

  4. Dans Maven, activez le filtrage des ressources - cela obligera 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> 
 <ressources> 
 <ressource> 
 <répertoire> src/main/ressources </ répertoire> 
 <filtering> true </ filtering> 
 </ resource> 
 </ resources> 
 </ build> 

Vous pouvez également accéder à d'autres propriétés standard telles que project.name, project.description ou même des propriétés arbitraires que vous avez définies dans votre pom <properties>, etc. Le filtrage des ressources, associé aux profils Maven, peut vous donner un comportement de construction variable lors de la construction. Lorsque vous spécifiez un profil au moment de l'exécution avec -PmyProfile, cela peut activer des propriétés qui peuvent ensuite apparaître dans votre construction.

213
Alex Miller

Les artefacts empaquetés contiennent un fichier META-INF/maven/${groupId}/${artifactId}/pom.properties dont le contenu ressemble à ceci:

#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 au moment de l'exécution. Aucune configuration n'est 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 pendant les tests, etc. (il existe un problème lié à Jira pour changer cela, voir MJAR -76 ). S'il s'agit d'un problème pour vous, l'approche décrite par Alex est la voie à suivre.

70
Pascal Thivent

La réponse acceptée peut constituer le moyen le plus sûr et le plus stable d’obtenir un numéro de version dans une applicationstatiquement, mais ne répond pas réellement à la question initiale: comment récupérer le numéro de version de l’artefact à partir de pom.xml? Ainsi, je veux offrir une alternative montrant comment le fairedynamiquementpendant l'exécution:

Vous pouvez utiliser Maven lui-même. Pour être plus précis, vous pouvez utiliser une bibliothèque Maven.

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

Et ensuite, faites quelque chose comme ça en 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

Update 2017-10-31: Pour répondre à la question suivante de Simon Sobisch, j'ai modifié l'exemple de la manière suivante:

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());
  }
}
65
kriegaex

Il existe également la méthode décrite dans Méthode simple pour afficher le numéro de version de vos applications à l'aide de 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>

Alors utilisez ceci:

App.class.getPackage().getImplementationVersion()

J'ai trouvé cette méthode plus simple.

39
adam.lofts

Pour compléter ce que @kieste a publié, ce qui, à mon avis, est le meilleur moyen d’avoir les informations de compilation de Maven disponibles dans votre code si vous utilisez Spring-boot: consultez la documentation de http://docs.spring.io/spring- boot/docs/current/reference/htmlsingle/# production-ready-application-application - est très utile.

Il vous suffit d'activer des actionneurs et d'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
[email protected]@
[email protected]@
[email protected]@
[email protected]@
15
coolnodje

Si vous utilisez un emballage mvn tel que jar ou war, utilisez:

getClass().getPackage().getImplementationVersion()

Il lit une propriété "Implementation-Version" du fichier META-INF/MANIFEST.MF généré (défini sur la version de pom.xml) dans l'archive.

13
electrobabe

Utilisez cette bibliothèque pour la facilité d'une solution simple. Ajoutez au manifeste ce dont vous avez besoin, puis interrogez-le par chaîne.

 System.out.println("JAR was created by " + Manifests.read("Created-By"));

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

6
feder
    <build>
            <finalName>${project.artifactId}-${project.version}</finalName>
            <pluginManagement>
                <plugins>
                    <plugin>
                        <groupId>org.Apache.maven.plugins</groupId>
                        <artifactId>maven-war-plugin</artifactId>
                        <version>3.2.2</version>
                        <configuration>
                            <failOnMissingWebXml>false</failOnMissingWebXml>
                            <archive>
                                <manifest>
                                    <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                                    <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
                                </manifest>
                            </archive>
                        </configuration>
                    </plugin>
                 </plugins>
            </pluginManagement>
</build>

Obtenir la version en utilisant this.getClass().getPackage().getImplementationVersion()

PS N'oubliez pas d'ajouter:

<manifest>
    <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
    <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
</manifest>
0
Ketan Keshri