J'ai remarqué que dans le JAR d'un artefact Maven, l'attribut project.version est inclus dans deux fichiers:
META-INF/maven/${groupId}/${artifactId}/pom.properties
META-INF/maven/${groupId}/${artifactId}/pom.xml
Existe-t-il un moyen recommandé de lire cette version au moment de l'exécution?
Réponses:
Vous ne devriez pas avoir besoin d'accéder aux fichiers spécifiques à Maven pour obtenir les informations de version d'une bibliothèque / classe donnée.
Vous pouvez simplement utiliser
getClass().getPackage().getImplementationVersion()
pour obtenir les informations de version stockées dans un fichier .jarMANIFEST.MF
.Heureusement, Maven est assez intelligentMalheureusement, Maven n'écrit pas non plus les informations correctes dans le manifeste par défaut!Au lieu de cela, il faut modifier l'
<archive>
élément de configuration dumaven-jar-plugin
to setaddDefaultImplementationEntries
etaddDefaultSpecificationEntries
totrue
, comme ceci:Idéalement, cette configuration devrait être mise dans l'entreprise
pom
ou dans un autre pom de base.Une documentation détaillée de l'
<archive>
élément peut être trouvée dans la documentation Maven Archive .la source
Pour suivre la réponse ci-dessus, pour un
.war
artefact, j'ai trouvé que je devais appliquer la configuration équivalente àmaven-war-plugin
, plutôt quemaven-jar-plugin
:Cela a ajouté les informations de version
MANIFEST.MF
dans le projet.jar
(inclus dansWEB-INF/lib
le.war
)la source
null
bien que le MANIFEST.MF dans les fichiers de guerre contienne les informations correctes.<archiveClasses>true</archiveClasses>
- et cela fonctionne de manière fiable depuis lors.Voici une méthode pour obtenir la version à partir du pom.properties, en revenant à l'obtenir à partir du manifeste
la source
J'ai passé du temps sur les deux approches principales ici et elles n'ont pas fonctionné pour moi. J'utilise Netbeans pour les builds, il se peut qu'il y en ait plus là-bas. J'ai eu des erreurs et des avertissements de Maven 3 avec certaines constructions, mais je pense que ceux-ci étaient faciles à corriger. Pas de problème.
J'ai trouvé une réponse qui semble maintenable et simple à mettre en œuvre dans cet article sur DZone:
J'ai déjà un sous-dossier resources / config, et j'ai nommé mon fichier: app.properties, pour mieux refléter le genre de choses que nous pouvons y conserver (comme une URL de support, etc.).
La seule mise en garde est que Netbeans avertit que l'EDI doit être filtré. Je ne sais pas où / comment. Cela n'a aucun effet à ce stade. Il y a peut-être un moyen de contourner ce problème si je dois traverser ce pont. Bonne chance.
la source
J'utilise
maven-assembly-plugin
pour mon emballage maven. L'utilisation d' Apache Maven Archiver dans la réponse de Joachim Sauer pourrait également fonctionner:Parce qu'archiever est l'un des composants partagés de maven , il pourrait être utilisé par plusieurs plugins de construction maven, ce qui pourrait également avoir un conflit si deux ou plusieurs plugins sont introduits, y compris la
archive
configuration à l'intérieur.la source
Pour que cela fonctionne dans Eclipse, ainsi que dans une version Maven, vous devez ajouter les entrées
addDefaultImplementationEntries
etaddDefaultSpecificationEntries
pom comme décrit dans les autres réponses, puis utiliser le code suivant:Si votre build Java place les classes cibles ailleurs que "cible / classes", vous devrez peut-être ajuster la valeur de segmentsToRemove.
la source
System.getProperty("user.dir")/pom.xml
. Je suis assez sûr que ce sera le cas pour d'autres choses, sauf peut-être pas pour WTP..getResource()
ou.getResourceAsStream()
.Sur mon application Spring Boot, la solution de la réponse acceptée a fonctionné jusqu'à ce que je mette récemment à jour mon jdk vers la version 12. J'ai également essayé toutes les autres réponses et je n'ai pas réussi à faire fonctionner cela.
À ce stade, j'ai ajouté la ligne ci-dessous à la première classe de mon application Spring Boot, juste après l'annotation
@SpringBootApplication
Plus tard, j'utilise ce qui suit pour obtenir la valeur du fichier de propriétés dans la classe dans laquelle je veux utiliser sa valeur et
appVersion
me donne la version du projet:J'espère que cela aide quelqu'un.
la source
Une solution simple qui est compatible Maven et fonctionne pour n'importe quelle classe (donc également tierce):
la source
Variante Java 8 pour EJB dans un fichier war avec le projet maven. Testé sur EAP 7.0.
la source