«1. Обзор

В этом кратком руководстве представлены различные способы определения точки входа в приложение Spring Boot с помощью Maven и Gradle.

Основной класс приложения Spring Boot — это класс, содержащий общедоступный метод static void main(), который запускает Spring ApplicationContext. По умолчанию, если основной класс не указан явно, Spring будет искать его в пути к классам во время компиляции и не запустится, если ни один из них не будет найден или их несколько.

В отличие от обычных приложений Java, основной класс, обсуждаемый в этом руководстве, не отображается как свойство метаданных основного класса в META-INF/MANIFEST.MF результирующего файла JAR или WAR.

Spring Boot ожидает, что для свойства метаданных основного класса артефакта будет установлено значение org.springframework.boot.loader.JarLauncher (или WarLauncher), что означает, что передача нашего основного класса непосредственно в командную строку java не запустит нашу Spring Boot приложение правильно.

Пример манифеста выглядит следующим образом:

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

Вместо этого нам нужно определить свойство Start-Class в манифесте, которое оценивается JarLauncher для запуска приложения.

Давайте посмотрим, как мы можем управлять этим свойством с помощью Maven и Gradle.

2. Maven

Основной класс можно определить как элемент начального класса в разделе свойств pom.xml:

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

Обратите внимание, что это свойство будет оцениваться, только если мы также добавим spring-boot-starter-parent как \u003cparent\u003e в нашем 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.baeldung.DemoApplication</mainClass>
            </configuration>
        </plugin>
    </plugins>
</build>

Пример этой конфигурации Maven можно найти по ссылке на Гитхабе.

3. Gradle

Если мы используем плагин Spring Boot Gradle, есть несколько конфигураций, унаследованных от org.springframework.boot, где мы можем указать наш основной класс.

В файле Gradle проекта mainClassName можно определить в блоке конфигурации springBoot. Это изменение, сделанное здесь, подхватывается задачей bootRun и bootJar:

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

Кроме того, основной класс может быть определен как свойство mainClassName задачи bootJar Gradle:

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

Или как атрибут манифеста bootJar task:

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

Обратите внимание, что основной класс, указанный в блоке конфигурации bootJar, влияет только на JAR, создаваемый самой задачей. Это изменение не влияет на поведение других задач Spring Boot Gradle, таких как bootRun.

В качестве бонуса, если к проекту применяется подключаемый модуль приложения Gradle, mainClassName можно определить как глобальное свойство:

mainClassName = 'com.baeldung.DemoApplication'

Мы можем найти пример этих конфигураций Gradle на GitHub.

4. Использование CLI

Мы также можем указать основной класс через интерфейс командной строки.

Spring Boot org.springframework.boot.loader.PropertiesLauncher поставляется с аргументом JVM, чтобы позволить вам переопределить логический основной класс, называемый loader.main:

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

5. Заключение

Существует более несколько способов указать точку входа в приложение Spring Boot. Важно знать, что все эти конфигурации — просто разные способы изменения манифеста файла JAR или WAR.

Примеры рабочего кода можно найти здесь и здесь.