Générer un fichier Version.java dans Maven

J’ai un projet Java que je construis en utilisant un script Ant. J’essaie de convertir le projet en Maven.

L’une des tâches génère un fichier source Java appelé Version.java qui contient une représentation statique de la chaîne temporelle de compilation, comme suit:

package com.foo.bar; public final class Version { public static Ssortingng VERSION="100301.1046"; } 

La tâche Ant est très simple:

        

Est-il possible de faire quelque chose de similaire dans Maven, en utilisant des sources générées ou une autre méthode simple?

Je ne pense pas que ce soit la bonne façon de résoudre ce genre de problème.

Une meilleure méthode consiste à placer les informations de version dans un fichier de properties qui sera lu par votre programme Java:

Votre fichier de propriétés contiendra la ligne suivante:

 myapp.version=${project.version} 

Ensuite, dans votre pom.xml , indiquez que le fichier sera filtré par Maven:

   the/directory/that/contains/your/properties/file true   

Lorsque Maven construira votre application, elle remplacera tous les ${...} par leur valeur. Par défaut, ${project.version} définit la version du pom.xml (c’est-à-dire la valeur de la ).

Ensuite, dans votre code Java, il vous suffit de charger le fichier de properties et de récupérer la valeur de la propriété myApp.version .

Notez que vous pouvez utiliser le plug-in Build Number pour définir quelque chose de plus “complexe” que votre version actuelle (par exemple, si vous souhaitez placer le temps de compilation dans votre propriété).

Vous pouvez aussi utiliser maven-replacer-plugin si vous pensez que mt est un peu moche:

  ...  src/main/java/com/stackoverflowVersion.java.template src/main/java/com/stackoverflow/Version.java  ...    com.google.code.maven-replacer-plugin maven-replacer-plugin 1.4.0   process-sources  replace     ${version.template.file} ${version.file}   @buildnumber@ ${svn.revision}   @buildtime@ ${maven.build.timestamp}   @pomversion@ ${project.version}       ...  

La version.java.template pourrait être:

 package com.stackoverflow; public final class Version { public static final Ssortingng build_number="@buildnumber@"; public static final Ssortingng build_time="@buildtime@"; public static final Ssortingng pomversion="@pomversion@"; } 

C’est une vieille question, mais il y a une autre solution qui fait un excellent travail parfaitement (au sens de Maven): Templating Maven Plugin .

En utilisant ce plug-in, le fichier Java traité est placé dans le dossier target/generated-sources , comme prévu. Et il ajoute le dossier sous les generated-sources au chemin de compilation. Vous ne pourrez plus enregistrer le fichier traité par erreur.

Comment utiliser

src/main/java-templates/com/foo/bar/Version.java abord les éléments suivants sous src/main/java-templates/com/foo/bar/Version.java :

 package com.foo.bar; public final class Version { public static final Ssortingng VERSION = "${project.version}"; } 

Ajoutez ensuite ce qui suit à votre POM:

   ...  org.codehaus.mojo templating-maven-plugin 1.0.0   filtering-java-templates  filter-sources     ...   

Le dossier target/generated-sources/java-templates est ajouté au chemin de construction par Maven.

Voici une autre solution qui produira les mêmes réponses que Ralph, en utilisant le filtrage des propriétés de pom et un fichier de modèle:

Le fichier modèle (VersionJava.template placé dans src / main / resources / version):

 package ${ver.package.name}; public final class ${ver.class.name} { public static Ssortingng VERSION="${ver.buildtime}"; } 

Le pom:

  ... com/foo/bar${project.artifactId} com.foo.bar${project.artifactId} Version ${maven.build.timestamp} src/main/resources/version VersionJava.template     src/main/resources  version/*    ${ver.template.dir}  *.java  true ${basedir}/src/main/java/${ver.package.dir}     maven-antrun-plugin   generate-sources       run    comstack       run       

Maintenant, cela peut sembler excessif, mais il est extrêmement polyvalent, et ce que j’aime le plus, c’est que le fichier de modèle se trouve dans un format lisible (plutôt que de renvoyer des instructions dans le pom). Cela me permet également de modifier la classe de la version sans avoir à changer le pom

Basé sur la réponse de @superole . Ceci est une version simplifiée sans avoir besoin de définir des propriétés supplémentaires. Seule la version du projet est copiée dans Version.java.

Placez Version.java dans src/main/templates :

 package thepackage; public final class Version { public static Ssortingng VERSION="${project.version}"; } 

Demander à maven de remplacer les jetons dans Version.java

   src/main/templates  *.java  true ${project.build.directory}/generated-sources/java/thepackage   

Demandez à maven de connaître les generated-sources/java tant que chemin de construction:

  org.codehaus.mojo build-helper-maven-plugin 1.8   add-source generate-sources  add-source    ${project.build.directory}/generated-sources/java/      

Enfin, laissez Eclipse m2e

  • être conscient du nouveau chemin de construction
  • et ne pas tomber dans une construction en boucle sans fin.

Le deuxième point est atteint en désactivant l’utilisation du plugin maven-resources-plugin lors de la génération incrémentielle d’eclipse.

    org.eclipse.m2e lifecycle-mapping 1.0.0      org.codehaus.mojo build-helper-maven-plugin [1.0,)  parse-version add-source maven-version add-resource add-test-resource add-test-source     true true      org.apache.maven.plugins maven-resources-plugin [1.0.0,)  resources     true false          

thepackage doit être remplacé par votre package: ajustez également le targetPath conséquence. J’ai trouvé plus facile de définir le chemin dans targetpath au lieu d’avoir plusieurs sous-dossiers dans src/main/templates .

Après plus de googling, je suis venu avec ceci (dans le pom.xml):

  ...  org.apache.maven.plugins maven-antrun-plugin 1.3    run  generate-sources                 ...  

Il semble bien fonctionner et produit ce fichier Java:

 package com.foo.bar; public final class Version { public static Ssortingng VERSION="100318.1211"; } 

Comme suggéré par @Romain, vous pouvez lire la version à partir d’un fichier de propriétés (soit /META-INF/maven/groupId/artifactId/pom.properties si vous pouvez attendre le packaging ou lancer votre propre fichier filtré si vous ne pouvez pas ou s’il ne fournit pas tout ce dont vous avez besoin).

Et est-ce que vous voulez vous en tenir à votre classe de Version actuelle, alors jetez un œil sur ce thread dans la liste des utilisateurs de maven qui propose précisément une solution (basée sur le plug-in antrun que vous allez lier dans la phase generated-sources ) .

Je le fais en utilisant le plug- in WAR Maven en ajoutant des informations au fichier MANIFEST.MF et en lisant plus tard ce fichier MANIFEST.MF en Java:

   org.apache.maven.plugins maven-war-plugin 2.6    true true   ${maven.build.timestamp}     

Cette configuration génère le fichier MANIFEST.MF suivant:

 Manifest-Version: 1.0 Implementation-Title: MyApp Implementation-Version: 2.11.0-SNAPSHOT Built-By: niestroj Specification-Title: MyApp Implementation-Vendor-Id: com.mycompany Build-Time: 2017-01-09 15:30 Created-By: Apache Maven 3.0.5 Build-Jdk: 1.8.0_40 Specification-Version: 2.11 

Et plus tard je lis ceci en Java comme ceci:

  try { Manifest manifest = new Manifest(getServletContext().getResourceAsStream("/META-INF/MANIFEST.MF")); Atsortingbutes atsortingbutes = manifest.getMainAtsortingbutes(); atsortingbutes.getValue("Implementation-Version"); atsortingbutes.getValue("Build-Time"); } catch (IOException ex) { LOGGER.debug("Error reading manifest file information", ex); } 

La méthode standard pour faire cela avec très peu de lignes de code XML consiste maintenant à utiliser le plugin templating-maven.

Voir ma réponse dans Filtrage du code source dans Maven

En général, la méthode Maven consiste à décrire ce que vous voulez faire. Puis figure comment . Lorsque vous avez besoin de dizaines ou de centaines de lignes de XML, vous pouvez soit trouver le bon plug-in qui le fait, soit l’écrire. C’était la raison d’être du plugin templating-maven :-).