1. Обзор
В этом кратком руководстве представлены различные способы определения точки входа в приложение Spring Boot с помощью Maven и Gradle.
Основной класс приложения Spring Boot — это класс, который содержит общедоступный метод static void main()
, который запускает Spring ApplicationContext
. По умолчанию, если основной класс не указан явно, Spring будет искать его в пути к классам во время компиляции и не запустится, если ни один из них или несколько из них не будут найдены.
В отличие от обычных приложений Java, основной класс, обсуждаемый в этом руководстве, не отображается как свойство метаданных основного класса
в META-INF/MANIFEST.MF результирующего файла JAR или WAR.
Spring Boot ожидает, что для свойства метаданных Main-Class артефакта будет установлено значение
org.springframework.boot.loader.JarLauncher
** (или WarLauncher
) ** , что означает, что передача нашего основного класса непосредственно в командную строку java не запустит наше приложение Spring Boot правильно.
Примерный манифест выглядит так:
Manifest-Version: 1.0
Start-Class: com.foreach.DemoApplication
Main-Class: org.springframework.boot.loader.JarLauncher
Вместо этого нам нужно определить свойство Start-Class
в манифесте, которое оценивается JarLauncher
для запуска приложения.
Давайте посмотрим, как мы можем управлять этим свойством с помощью Maven и Gradle.
2. Мавен
Основной класс можно определить как элемент начального класса
в разделе свойств pom.xml
:
<properties>
<!-- The main class to start by executing "java -jar" -->
<start-class>com.foreach.DemoApplication</start-class>
</properties>
Обратите внимание, что это свойство будет оцениваться только в том случае, если мы также добавим spring-boot-starter-parent как <parent>
в наш pom.xml
.
В качестве альтернативы основной класс можно определить как элемент mainClass модуля
spring-boot-maven-plugin
в разделе плагинов нашего pom.xml
:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.foreach.DemoApplication</mainClass>
</configuration>
</plugin>
</plugins>
</build>
Пример этой конфигурации Maven можно найти на GitHub.
3. Грейдл
Если мы используем плагин Spring Boot Gradle , есть несколько конфигураций, унаследованных от org.springframework.boot
, где мы можем указать наш основной класс.
В файле Gradle проекта mainClassName
можно определить в блоке конфигурации springBoot
. Это изменение, сделанное здесь, подхватывается задачами bootRun
и bootJar
:
springBoot {
mainClassName = 'cpm.foreach.DemoApplication'
}
В качестве альтернативы основной класс можно определить как свойство mainClassName задачи
bootJar
Gradle:
bootJar {
mainClassName = 'cpm.foreach.DemoApplication'
}
Или как атрибут манифеста задачи bootJar
:
bootJar {
manifest {
attributes 'Start-Class': 'com.foreach.DemoApplication'
}
}
Обратите внимание, что основной класс, указанный в блоке конфигурации bootJar
, влияет только на JAR, создаваемый самой задачей. Это изменение не влияет на поведение других задач Spring Boot Gradle, таких как bootRun
.
В качестве бонуса, если к проекту применяется подключаемый модуль приложения Gradle , mainClassName
можно определить как глобальное свойство:
mainClassName = 'com.foreach.DemoApplication'
Мы можем найти пример этих конфигураций Gradle на GitHub.
4. Использование командной строки
Мы также можем указать основной класс через интерфейс командной строки.
Spring Boot org.springframework.boot.loader.PropertiesLauncher
поставляется с аргументом JVM, чтобы вы могли переопределить логический основной класс, называемый loader.main
:
java -cp bootApp.jar -Dloader.main=com.foreach.DemoApplication org.springframework.boot.loader.PropertiesLauncher
5. Вывод
Существует несколько способов указать точку входа в приложение Spring Boot. Важно знать, что все эти конфигурации — просто разные способы изменения манифеста файла JAR или WAR.