Respuestas:
Suponiendo que está utilizando Java, puede
Cree un .properties
archivo en (más comúnmente) su src/main/resources
directorio (pero en el paso 4 podría decirle que busque en otro lado).
Establezca el valor de alguna propiedad en su .properties
archivo utilizando la propiedad estándar de Maven para la versión del proyecto: foo.bar=${project.version}
En su código Java, cargue el valor del archivo de propiedades como un recurso del classpath (google para ejemplos copiosos de cómo hacer esto, pero aquí hay un ejemplo para empezar ).
En Maven, habilite el filtrado de recursos: esto hará que Maven copie ese archivo en sus clases de salida y traduzca el recurso durante esa copia, interpretando la propiedad. Puede encontrar información aquí, pero generalmente solo hace esto en su pom:
<construcción> <recursos> <recurso> <directory> src / main / resources </directory> <filtering> verdadero </filtering> </resource> </resources> </build>
También puede acceder a otras propiedades estándar como project.name
, project.description
o incluso propiedades arbitrarias que ponga en su pom <properties>
, etc. El filtrado de recursos, combinado con los perfiles de Maven, puede proporcionarle un comportamiento de compilación variable en el momento de la compilación. Cuando especifica un perfil en tiempo de ejecución con -PmyProfile
, eso puede habilitar propiedades que luego pueden aparecer en su compilación.
src/main/resources
, ya que esto puede procesar todos los archivos ubicados en este directorio, incluidos los archivos binarios. Para evitar comportamientos impredecibles, es mejor filtrar en un src/main/resources-filtered
directorio, como se sugiere aquí . De todos modos, ¡gracias por este buen truco!
La respuesta aceptada puede ser la mejor y más estable forma de obtener un número de versión en una aplicación de forma estática , pero en realidad no responde a la pregunta original: ¿Cómo recuperar el número de versión del artefacto de pom.xml? Por lo tanto, quiero ofrecer una alternativa que muestre cómo hacerlo dinámicamente durante el tiempo de ejecución:
Puedes usar Maven mismo. Para ser más exactos, puede usar una biblioteca Maven.
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-model</artifactId>
<version>3.3.9</version>
</dependency>
Y luego haz algo como esto 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());
}
}
El registro de la consola es el siguiente:
de.scrum-master.stackoverflow:my-artifact:jar:1.0-SNAPSHOT
de.scrum-master.stackoverflow
my-artifact
1.0-SNAPSHOT
Actualización 2017-10-31: para responder la pregunta de seguimiento de Simon Sobisch, modifiqué el ejemplo de esta manera:
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
d jar normal (las clases de dependencia no están integradas) y no funciona cuando se empaqueta con el complemento de ensamblaje maven jar-with-dependencies
que obtengo a java.io.FileNotFoundException: pom.xml
(está en el frasco final como META-INF/maven/my.package/myapp/pom.xml
): ¿alguna pista de cómo resolver esto?
Los artefactos empaquetados contienen un META-INF/maven/${groupId}/${artifactId}/pom.properties
archivo cuyo contenido se ve así:
#Generated by Maven
#Sun Feb 21 23:38:24 GMT 2010
version=2.5
groupId=commons-lang
artifactId=commons-lang
Muchas aplicaciones usan este archivo para leer la versión de la aplicación / jar en tiempo de ejecución, no se requiere ninguna configuración.
El único problema con el enfoque anterior es que este archivo se genera (actualmente) durante la package
fase y, por lo tanto, no estará presente durante las pruebas, etc. (hay un problema de Jira para cambiar esto, ver MJAR-76 ). Si esto es un problema para usted, entonces el enfoque descrito por Alex es el camino a seguir.
También está el método descrito en la forma fácil de mostrar el número de versión de sus aplicaciones usando Maven :
Agregue esto a 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>
Entonces usa esto:
App.class.getPackage().getImplementationVersion()
He encontrado que este método es más simple.
getImplementationVersion()
was null
. (Maven versión 3.0.4)
.war
artefactos, recuerde usar en maven-war-plugin
lugar demaven-jar-plugin
getImplementationVersion()
devuelve nulo).
Si usa empaques mvn como jar o war, use:
getClass().getPackage().getImplementationVersion()
Lee una propiedad "Versión de implementación" del META-INF / MANIFEST.MF generado (que se establece en la versión de pom.xml) en el archivo.
Para complementar lo que @kieste ha publicado, que creo que es la mejor manera de tener información de compilación de Maven disponible en su código si está utilizando Spring-boot: la documentación en http://docs.spring.io/spring-boot/ docs / current / reference / htmlsingle / # production-ready-application-info es muy útil.
Sólo tiene que actuadores activar y agrega las propiedades que necesita en su application.properties
oapplication.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@
Use esta biblioteca para facilitar la solución simple. Agregue al manifiesto lo que necesite y luego consulte por cadena.
System.out.println("JAR was created by " + Manifests.read("Created-By"));
A veces, la línea de comandos de Maven es suficiente cuando se escribe algo relacionado con la versión del proyecto, por ejemplo, para la recuperación de artefactos a través de URL desde un repositorio:
mvn help:evaluate -Dexpression=project.version -q -DforceStdout
Ejemplo de uso:
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>
Obtener versión usando this.getClass().getPackage().getImplementationVersion()
PD No olvides agregar:
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
</manifest>
Con referencia a la respuesta de ketankk :
Desafortunadamente, al agregar esto se confundió la forma en que mi aplicación manejó los recursos:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
Pero el uso de esta etiqueta <manifest> de maven-assemble-plugin hizo el truco:
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
Así que pude obtener la versión usando
String version = getClass().getPackage().getImplementationVersion();