Tips Spring : [BOOT] Build Info (Detalles de la compilación)

Última actualización: 17/09/2022
logo spring

El plugin de Maven de Spring Boot tiene un goal llamado build-info muy interesante. Cuando lo lanzamos, crear el fichero /target/classes/META-INF/build-info.properties con información sobre la compilación del proyecto.

mvn spring-boot:build-info
build.artifact=buildinfo
build.group=com.danielme.springboot
build.name=buildinfo
build.time=2022-09-16T18\:57\:22.154Z
build.version=0.0.1-SNAPSHOT

Habitualmente vamos a querer que el fichero se genere al compilar el proyecto para que siempre esté actualizado.

<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
        <executions>
          <execution>
            <id>build-info</id>
             <goals>
               <goal>build-info</goal>
              </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
</build>

También se pueden añadir propiedades adicionales.

<build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <executions>
          <execution>
            <id>build-info</id>
              <goals>
                <goal>build-info</goal>
              </goals>
              <configuration>
                <additionalProperties>
                  <sourceEncoding>${project.build.sourceEncoding}</sourceEncoding>
                  <custom>custom value</custom>
                  <java.version>${java.version}</java.version>
                  <java.vendor>${java.vendor}</java.vendor>
                </additionalProperties>
              </configuration>
            </execution>
          </executions>
      </plugin>
    </plugins>
</build>

Se definen en el bloque additionalProperties en formato clave-valor. En el ejemplo anterior vemos que pueden ser valores fijos (custom) o bien variables disponibles en Maven. Estas últimas incluyen las propiedades de java.lang.System, tales como java.version o java.vendor.

Al igual que las propiedades ya ofrecidas por el plugin, en el fichero aparecerán con el prefijo build.

build.artifact=buildinfo
build.custom=custom value
build.group=com.danielme.springboot
build.java.vendor=AdoptOpenJDK
build.java.version=1.8
build.name=buildinfo
build.sourceEncoding=UTF-8
build.time=2022-09-17T12\:11\:19.257Z
build.version=0.0.1-SNAPSHOT

Estos son los restantes parámetros del plugin, al menos en Spring Boot 2.7.

excludeInfoProperties. Lista de las propiedades que no deben aparecer en el fichero.

<excludeInfoProperties>
  <excludeInfoProperty>version</excludeInfoProperty>
</excludeInfoProperties>

outputFile. Permite cambiar la ubicación del fichero. Su valor predeterminado es ${project.build.outputDirectory}/META-INF/build-info.properties.

time. El valor para la propiedad time. Por omisión es ${project.build.outputTimestamp}.

Todas las propiedades son accesibles a través del bean BuildProperties el cual es creado por Spring Boot cuando exista el fichero. Lo inyectaremos donde lo necesitemos. Ofrece un getter para cada propiedad predefinida y uno genérico para las personalizadas que hemos añadido. La clave que usemos para leer una propiedad no debe tener el prefijo build.

package com.danielme.springboot.buildinfo;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.info.BuildProperties;

@SpringBootApplication
public class BuildInfoApplication implements CommandLineRunner {

    private static final Logger logger = LoggerFactory.getLogger(BuildInfoApplication.class);

    @Autowired
    private BuildProperties buildProperties;

    public static void main(String[] args) {
        SpringApplication.run(BuildInfoApplication.class, args);
    }

    @Override
    public void run(String... args) {
        logger.info("name: {}, custom: {}", buildProperties.getName(), buildProperties.get("custom"));
    }

}

Si tenemos Spring Boot Actuator en el proyecto, el contenido de build-info.properties se puede obtener vía REST en el endpoint /actuator/info. Consiste en un JSON que sigue la estructura jerárquica que definen los puntos en los nombres de las propiedades.

Desde Spring Boot 2.5, es obligatorio activar este endpoint explícitamente en el application.properties.

management.endpoints.web.exposure.include=info

Código de ejemplo

El código de ejemplo es un proyecto que se encuentra en GitHub. Para más información sobre cómo utilizar GitHub, consultar este artículo.

Otros tutoriales relacionados con Spring

Introducción a Spring Boot: Aplicación Web con servicios REST y Spring Data JPA

Testing en Spring Boot con JUnit 45. Mockito, MockMvc, REST Assured, bases de datos embebidas

Spring Boot: Gestión de errores en aplicaciones web y REST

Spring JDBC Template: simplificando el uso de SQL

Persistencia en BD con Spring Data JPA

Deja una respuesta

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.