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()

Más información aquí y aquí .

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 su pom.xml , un valor definido en la settings.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.

  1. cree un src/main/resources/info.txt con el siguiente contenido:

    version = $ {pom.version} build.date = $ {timestamp}

  2. 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>
    
  3. 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 de timestamp 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>
    
  4. ejecutar maven, debería encontrar un info.txt en target/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


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow