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?
En supposant que vous utilisez Java, vous pouvez
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).
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}
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 ).
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.
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.
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());
}
}
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.
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]@
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.
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"));
<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>