Spring Boot – Configuración de Clase Principal

Configurar Clase Principal en Spring Boot

En este rápido tutorial veremos dos formas de definir un punto de entrada en una aplicación Spring Boot a través de Maven y Gradle.

La clase principal de una aplicación Spring Boot es una clase que contiene un método public static void main() que inicia el ApplicationContext de Spring. De forma predeterminada, si la clase principal no está explícitamente especificada, Spring buscará una en el classpath en tiempo de compilación y no podrá iniciarse si no se encuentra ninguna o varias de ellas.

Spring Boot espera que la propiedad de metadatos de Main-Class del artefacto se establezca en org.springframework.boot.loader.JarLauncher  (o WarLauncher ), lo  que significa que al pasar nuestra clase principal directamente a la línea de comandos java no se iniciará correctamente nuestra aplicación Spring Boot.

Un manifest de ejemplo se ve así:

Manifest-Version: 1.0
Start-Class: org.baeldung.DemoApplication
Main-Class: org.springframework.boot.loader.JarLauncher

En su lugar, necesitamos definir la propiedad de clase de inicio en el manifiesto que JarLauncher evalúa para iniciar la aplicación.

Veamos cómo podemos controlar esta propiedad usando Maven y Gradle.

Maven

La clase principal se puede definir como un elemento de clase de inicio en la sección de propiedades de pom.xml :

<properties>
      <!-- The main class to start by executing "java -jar" -->
      <start-class>org.baeldung.DemoApplication</start-class>
</properties>

Tenga en cuenta que esta propiedad solo se evaluará si también agregamos spring-boot-starter-parent como <parent> en nuestro  pom.xml .

Alternativamente, la clase principal se puede definir como el elemento  mainClass del plugin spring-boot-maven en la sección de plugin de nuestro pom.xml :

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>             
            <configuration>    
                <mainClass>org.baeldung.DemoApplication</mainClass>
            </configuration>
        </plugin>
    </plugins>
</build>

Gradle

Si utilizamos el complemento Spring Boot Gradle , hay algunas configuraciones heredadas de  org.springframework.boot  donde podríamos especificar nuestra clase principal.

En el archivo Gradle del proyecto,  mainClassName se puede definir dentro springBoot bloque de configuración . Este cambio realizado aquí es recogido por las tareas bootRun y bootJar :

springBoot {
    mainClassName = 'org.baeldung.DemoApplication'
}

Por otra parte, la clase principal se puede definir como la mainClassName propiedad de bootJartarea Gradle:

bootJar {
    mainClassName = 'org.baeldung.DemoApplication'
}

O como un atributo manifiesto de la  tarea bootJar :

bootJar {
    manifest {
    attributes 'Start-Class': 'org.baeldung.DemoApplication'
    }
}

Tenga en cuenta que la clase principal especificada en el  bloque de configuración bootJar solo afecta al JAR que produce la tarea en sí. El cambio no afecta el comportamiento de otras tareas de Spring Boot Gradle, como  bootRun .

Como beneficio adicional, si el complemento de la aplicación Gradle se aplica al proyecto, mainClassName se puede definir como una propiedad global:

mainClassName = 'org.baeldung.DemoApplication'

Usando CLI

También podemos especificar una clase principal a través de la interfaz de línea de comando.

El org.springframework.boot.loader.PropertiesLauncher de Spring Boot   viene con un argumento JVM que le permite anular la clase principal lógica llamada loader.main :

java -cp bootApp.jar -Dloader.main=org.baeldung.DemoApplication org.springframework.boot.loader.PropertiesLauncher

Hay más de unas pocas formas de especificar el punto de entrada a una aplicación Spring Boot. Es importante saber que todas estas configuraciones son solo formas diferentes de modificar el manifiesto de un archivo JAR o WAR.

Fuente y mas Información aquí.

1 COMMENTS
  • By antonio

    Buenas, buen aporte.

    / Responder

LEAVE YOUR COMMENTS