Réponses:
En supposant que vous utilisez Java, vous pouvez
Créez un .properties
fichier dans (le plus souvent) votre src/main/resources
répertoire (mais à l'étape 4, vous pourriez lui dire de chercher ailleurs).
Définissez la valeur d'une propriété dans votre .properties
fichier à 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 chemin de classe (google pour de nombreux exemples sur la façon de procéder, 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, interprétant la propriété. Vous pouvez trouver des informations ici, mais vous le faites principalement dans votre pom:
<build> <ressources> <ressource> <directory> src / main / resources </directory> <filtering> true </filtering> </resource> </resources> </build>
Vous pouvez également accéder à 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ée avec des profils Maven, peuvent vous donner un comportement de construction variable à temps de 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 build.
src/main/resources
, car cela peut traiter tous les fichiers situés dans ce répertoire, y compris les fichiers binaires. Pour éviter les comportements imprévisibles, il est préférable de filtrer sur un src/main/resources-filtered
répertoire, comme suggéré ici . Quoi qu'il en soit, merci pour cette belle astuce!
La réponse acceptée peut être le moyen le meilleur et le plus stable pour obtenir un numéro de version dans une application de manière statique , mais ne répond pas réellement à la question d'origine: 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 faire dynamiquement pendant 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 puis 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
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());
}
}
package
pot d normal (les classes de dépendance ne sont pas intégrées) et ne fonctionne pas lorsqu'il est empaqueté avec maven-assembly-plugin jar-with-dependencies
que j'obtiens a java.io.FileNotFoundException: pom.xml
(il se trouve dans le pot final META-INF/maven/my.package/myapp/pom.xml
) - des conseils pour résoudre ce problème?
Les artefacts emballés contiennent un META-INF/maven/${groupId}/${artifactId}/pom.properties
fichier 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 lors 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 package
phase et ne sera donc pas présent pendant les tests, etc. (il y a un problème avec Jira pour changer cela, voir MJAR-76 ). Si c'est un problème pour vous, alors l'approche décrite par Alex est la voie à suivre.
Il existe également la méthode décrite dans Easy way 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>
Ensuite, utilisez ceci:
App.class.getPackage().getImplementationVersion()
J'ai trouvé cette méthode plus simple.
getImplementationVersion()
était null
. (maven version 3.0.4)
.war
artefacts, n'oubliez pas d'utiliser maven-war-plugin
au lieu demaven-jar-plugin
getImplementationVersion()
renvoie null).
Si vous utilisez un emballage mvn tel que pot ou guerre, utilisez:
getClass().getPackage().getImplementationVersion()
Il lit une propriété "Implementation-Version" du META-INF / MANIFEST.MF généré (qui est défini sur la version de pom.xml) dans l'archive.
Pour compléter ce que @kieste a posté, ce qui, à mon avis, est le meilleur moyen pour que Maven compile les informations disponibles dans votre code si vous utilisez Spring-boot: la documentation sur http://docs.spring.io/spring-boot/ docs / current / reference / htmlsingle / # production-ready-application-info est très utile.
Il vous suffit d'activer les actionneurs et d'ajouter les propriétés dont vous avez besoin dans votre application.properties
ouapplication.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@
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"));
Parfois, la ligne de commande Maven est suffisante lors de l'écriture d'un script lié à la version du projet, par exemple pour la récupération d'artefacts via une URL à partir d'un référentiel:
mvn help:evaluate -Dexpression=project.version -q -DforceStdout
Exemple d'utilisation:
VERSION=$( mvn help:evaluate -Dexpression=project.version -q -DforceStdout )
ARTIFACT_ID=$( mvn help:evaluate -Dexpression=project.artifactId -q -DforceStdout )
GROUP_ID_URL=$( mvn help:evaluate -Dexpression=project.groupId -q -DforceStdout | sed -e 's#\.#/#g' )
curl -f -S -O http://REPO-URL/mvn-repos/${GROUP_ID_URL}/${ARTIFACT_ID}/${VERSION}/${ARTIFACT_ID}-${VERSION}.jar
<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>
En référence à la réponse de Ketankk :
Malheureusement, l'ajout de cela a gâché la façon dont ma demande traitait les ressources:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
Mais l'utilisation de cette balise <manifest> de maven-assemble-plugin a fait l'affaire:
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
J'ai donc pu obtenir la version en utilisant
String version = getClass().getPackage().getImplementationVersion();