Inicialização Spring: Configurando uma Classe Principal
1. Visão geral
Este tutorial rápido fornece diferentes maneiras de definir um ponto de entrada em um aplicativo Spring Boot via Maven e Gradle.
A classe principal de um aplicativo Spring Boot é uma classe que contém um métodopublic static void main() que inicia o SpringApplicationContext. By default, if the main class isn’t explicitly specified, Spring will search for one in the classpath at compile time and fail to start if none or multiple of them are found.
Ao contrário dos aplicativos Java convencionais, a classe principal discutida neste tutorial não aparece como a propriedade de metadadosMain-Class em META-INF / MANIFEST.MF do arquivo JAR ou WAR resultante.
Spring Boot espera que a propriedade de metadadosMain-Class do artefato seja definida comoorg.springframework.boot.loader.JarLauncher (ouWarLauncher) o que significa que passar nossa classe principal diretamente para o comando java linha não iniciará nosso aplicativo Spring Boot corretamente.
Um exemplo de manifesto se parece com isso:
Manifest-Version: 1.0
Start-Class: org.example.DemoApplication
Main-Class: org.springframework.boot.loader.JarLauncher
Em vez disso, precisamos definir a propriedadeStart-Class no manifesto, que é avaliada porJarLauncher para iniciar o aplicativo.
Vamos ver como podemos controlar essa propriedade usando Maven e Gradle.
2. Maven
A classe principal pode ser definida como elementoa start-class na seção de propriedades depom.xml:
org.example.DemoApplication
Observe quethis property will only be evaluated if we also add the spring-boot-starter-parent como<parent> em nossopom.xml.
Como alternativa,the main class can be defined as the mainClass element of the spring-boot-maven-plugin na seção de plug-in do nossopom.xml:
org.springframework.boot
spring-boot-maven-plugin
org.example.DemoApplication
Um exemplo desta configuração Maven pode ser encontradoover on GitHub.
3. Gradle
Se estivermos usandoSpring Boot Gradle plugin, existem algumas configurações herdadas deorg.springframework.boot onde poderíamos especificar nossa classe principal.
No arquivo Gradle do projeto,mainClassName pode ser definido comowithin springBoot configuration block. Esta alteração feita aqui é obtida pela tarefabootRunebootJar:
springBoot {
mainClassName = 'org.example.DemoApplication'
}
Como alternativa, a classe principal pode ser definida como a propriedademainClassName da tarefa Gradle debootJar:
bootJar {
mainClassName = 'org.example.DemoApplication'
}
Ou como um atributo manifesto da tarefabootJar:
bootJar {
manifest {
attributes 'Start-Class': 'org.example.DemoApplication'
}
}
Observe que a classe principal especificada no bloco de configuraçãobootJar afeta apenas o JAR que a própria tarefa produz. A mudança não afeta o comportamento de outras tarefas do Spring Boot Gradle, comobootRun.
Como bônus, se oGradle application plugin for aplicado ao projeto,mainClassName can be defined as a global property:
mainClassName = 'org.example.DemoApplication'
Podemos encontrar um exemplo dessas configurações do Gradleover on GitHub.
4. Usando CLI
Também podemos especificar uma classe principal através da interface da linha de comandos.
org.springframework.boot.loader.PropertiesLauncher do Spring Boot vem com um argumento JVM para permitir que você substitua a classe principal lógica chamadaloader.main:
java -cp bootApp.jar -Dloader.main=org.example.DemoApplication org.springframework.boot.loader.PropertiesLauncher