Spring Boot: Configuración de una clase principal

1. Información general

Este tutorial rápido proporciona diferentes 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 público estático void main () que inicia Spring ApplicationContext . De forma predeterminada, si la clase principal no se especifica explícitamente, Spring buscará una en la ruta de clases en el momento de la compilación y no se iniciará si no se encuentra ninguna o varias de ellas.

A diferencia de las aplicaciones Java convencionales, la clase principal analizada en este tutorial no aparece como la propiedad de metadatos de la clase principal en META-INF / MANIFEST.MF del archivo JAR o WAR resultante.

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

Un manifiesto de ejemplo se ve así:

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

En su lugar, necesitamos definir la propiedad Start-Class en el manifiesto que es evaluado por JarLauncher para iniciar la aplicación.

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

2. Maven

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

  com.baeldung.DemoApplication  

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

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

   org.springframework.boot spring-boot-maven-plugin  com.baeldung.DemoApplication    

Se puede encontrar un ejemplo de esta configuración de Maven en GitHub.

3. Gradle

Si estamos usando 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 del bloque de configuración springBoot . Este cambio realizado aquí es recogido por bootRun y la tarea bootJar :

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

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

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

O como un atributo manifiesto de la tarea bootJar :

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

Tenga en cuenta que la clase principal especificada en el bloque de configuración bootJar solo afecta al JAR que produce la propia tarea. 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 = 'com.baeldung.DemoApplication' 

Podemos encontrar un ejemplo de estas configuraciones de Gradle en GitHub.

4. Usando CLI

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

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

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

5. Conclusión

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.

Se pueden encontrar ejemplos de código de trabajo aquí y aquí.