Apache Maven
Acceso a las informaciones de Maven en código.
Buscar..
Introducción
A veces es útil obtener las propiedades de Maven, como la versión actual, en el código. Aquí hay algunas maneras de hacerlo.
Obtener el número de versión dentro de un tarro
Si empaqueta su aplicación en un jar
utilizando el maven-jar-plugin
o el maven-jar-plugin
maven-assembly-plugin
, una manera fácil de obtener la versión actual de pom es agregar una entrada en el manifiesto, que luego está disponible en Java.
El secreto es establecer el indicador addDefaultImplementationEntries
en verdadero (y el addDefaultSpecificationEntries
es que también necesita la identificación del artefacto).
configuración del plugin jar :
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>...</mainClass>
<addDefaultImplementationEntries>
true
</addDefaultImplementationEntries>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
configuración del complemento de montaje :
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
</manifest>
</archive>
</configuration>
<executions>
<execution .../>
</executions>
</plugin>
addDefaultImplementationEntries
indica a Maven que agregue los siguientes encabezados al MANIFEST.MF
de su MANIFEST.MF
jar:
Implementation-Title: display-version
Implementation-Version: 1.0-SNAPSHOT
Implementation-Vendor-Id: test
Ahora puedes usar esta línea de código en cualquier lugar de tu archivo para acceder al número de versión:
getClass().getPackage().getImplementationVersion()
Mantener un archivo de propiedades sincronizado usando el mecanismo de filtrado de propiedades de maven
Como explica esta documentación ,
A veces, un archivo de recursos deberá contener un valor que solo se puede proporcionar en el momento de la compilación. Para lograr esto en Maven, ponga una referencia a la propiedad que contendrá el valor en su archivo de recursos usando la sintaxis
${<property name>}
. La propiedad puede ser uno de los valores definidos en supom.xml
, un valor definido en lasettings.xml
del usuario.xml, una propiedad definida en un archivo de propiedades externo o una propiedad del sistema.
Como ejemplo, vamos a crear un simple info.txt
en src/main/resources
contiene la versión pom y el tiempo de compilación.
cree un
src/main/resources/info.txt
con el siguiente contenido:version = $ {pom.version} build.date = $ {timestamp}
Pídale a Maven que expanda las propiedades estableciendo el
filtering
en verdadero:<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build>
con eso, la versión se actualizará, pero desafortunadamente un error dentro de Maven evita que la propiedad
${maven.build.timestamp}
pase al mecanismo de filtrado de recursos (más información aquí ). Por lo tanto, vamos a crear una propiedad detimestamp
como una solución! Agregue lo siguiente a las propiedades del pom:<properties> <timestamp>${maven.build.timestamp}</timestamp> <maven.build.timestamp.format>yyyy-MM-dd'T'HH:mm</maven.build.timestamp.format> </properties>
ejecutar maven, debería encontrar un
info.txt
entarget/classes
con un contenido como:version=0.3.2 build.date=2017-04-20T13:56
Leyendo un pom.xml en tiempo de ejecución usando el complemento maven-model
Los otros ejemplos pueden ser la manera mejor y más estable de obtener un número de versión en una aplicación de forma estática . Esta respuesta propone una alternativa que muestra cómo hacerlo dinámicamente durante el tiempo de ejecución, utilizando la biblioteca maven-model maven .
Agregue la dependencia:
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-model</artifactId>
<version>3.3.9</version>
</dependency>
En Java, crea un MavenXpp3Reader
para leer tu pom. Por ejemplo:
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 MavenModelExample {
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