Сегодня мы поговорим о том, как превратить ваше Spring Boot приложение из симпатичного кода в реальный работающий артефакт (jar- или war-файл), готовый к запуску где угодно: начиная от вашего локального ноутбука, заканчивая облачными серверами.
Основные цели лекции
- Узнать, как правильно подготовить Spring Boot приложение для деплоя.
- Разобраться, что такое
jarиwarфайлы, и чем они отличаются. - Настроить Maven для создания этих артефактов.
- Подготовить версионирование приложения для удобной работы в CI/CD.
Немного теории: jar, war и зачем это нужно
JAR (Java Archive) — это архивированный файл, в котором упаковано ваше приложение и все его зависимости. Если говорить простыми словами, это "чемодан" с вещами, который можно запустить прямо так, как есть:
java -jar your-app.jar
- Преимущество JAR: они "самодостаточные". Spring Boot добавляет во внутрь JAR файлы зависимостей и встроенный веб-сервер (например, Tomcat).
- Когда использовать:
- Если приложение будет запускаться как самостоятельный процесс.
- Если сервер уже настроен для работы с Spring Boot.
WAR (Web Application Archive) — это архив для веб-приложений, который обычно разворачивается на стороннем веб-сервере, таком как Apache Tomcat или Jetty. Он не включает в себя встроенный веб-сервер.
- Преимущество WAR: подходит для развёртывания на давно работающем сервере, куда можно "подложить" ваш артефакт.
- Когда использовать:
- Если ваш проект разрабатывается как часть более крупной системы.
- Если серверная инфраструктура жёстко регламентирована (например, "мы используем Tomcat и точка").
Практика 1. Создание JAR файла
Попробуем собрать наше Spring Boot приложение в виде JAR-файла. Для этого потребуется внести изменения в pom.xml и выполнить несколько команд.
Шаг 1. Подготовка проекта
Убедитесь, что у вас есть рабочий проект на Spring Boot. Если ещё нет — создайте базовое приложение через Spring Initializer.
Структура проекта должна выглядеть примерно так:
src/
|-- main/
| |-- java/
| | |-- com.example.demo
| | |-- DemoApplication.java
| |-- resources/
| |-- application.properties
pom.xml
Шаг 2. Настройка Maven для создания JAR
В pom.xml убедитесь, что указано создание JAR файла. Настройка будет выглядеть так:
<build>
<plugins>
<!-- Плагин для сборки Spring Boot приложения -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- Дополнительно можно указать плагин для ресурсов -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
</plugin>
</plugins>
</build>
Обратите внимание, что spring-boot-maven-plugin делает всю магию за нас: он не только собирает JAR, но и добавляет туда зависимости и встроенный веб-сервер.
Шаг 3. Сборка проекта
Соберите JAR файл с помощью команды:
mvn clean install
После выполнения в папке target появится файл вроде:
demo-0.0.1-SNAPSHOT.jar
Запустим его:
java -jar target/demo-0.0.1-SNAPSHOT.jar
Если всё настроено правильно, вы увидите сообщение, что сервер поднят на http://localhost:8080.
Практика 2. Создание WAR-файла
Теперь сделаем то же самое, но для WAR-файла. В этом случае процесс немного отличается.
Шаг 1. Настройка Maven для создания WAR
Добавляем в pom.xml настройку для WAR:
<packaging>war</packaging>
<build>
<plugins>
<!-- Плагин для сборки Spring Boot приложения -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
Обратите внимание на packaging — этот тег указывает Maven, что проект должен быть собран как WAR.
Шаг 2. Изменения в коде приложения
Поскольку WAR не включает встроенный сервер, мы должны настроить приложение для работы с внешним контейнером. В файле DemoApplication.java наследуем класс SpringBootServletInitializer:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
@SpringBootApplication
public class DemoApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
Шаг 3. Сборка проекта
Теперь собираем проект:
mvn clean install
На выходе мы получим файл demo-0.0.1-SNAPSHOT.war.
Версионирование артефактов
Раз уж мы занимаемся деплоем, давайте сделаем наше приложение "умнее". Добавьте версию проекта в pom.xml, чтобы артефакты имели уникальные названия:
<version>1.0.0</version>
Теперь ваш JAR или WAR будет называться, например, demo-1.0.0.jar. Это особенно полезно при работе с CI/CD, поскольку позволяет легко отслеживать, какая версия развернута на сервере.
Типичные ошибки и их решения
- Пропущен тег
<packaging>в pom.xml.
Если вы не указали<packaging>jar</packaging>(илиwar), Maven по умолчанию соберёт JAR. Всегда проверяйте этот тег. - Ошибка "No Main Manifest Attribute".
Это значит, что в созданной сборке отсутствует точка входа. Убедитесь, что файлDemoApplicationсодержит методmain, и чтоSpring-Boot-Maven-Pluginдобавлен вpom.xml. - WAR не разворачивается на сервере.
Проверьте, что добавлен класс, наследующийSpringBootServletInitializer.
Вот и всё! Теперь ваше приложение готово к деплою, будь то локальный сервер, облако или контейнерная платформа. В следующих лекциях мы углубимся в тему контейнеризации с помощью Docker.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ