JavaRush /Курсы /Модуль 5. Spring /Лекция 147: Подготовка Spring Boot приложения для деплоя ...

Лекция 147: Подготовка Spring Boot приложения для деплоя (создание jar/war файлов)

Модуль 5. Spring
15 уровень , 6 лекция
Открыта

Сегодня мы поговорим о том, как превратить ваше 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, поскольку позволяет легко отслеживать, какая версия развернута на сервере.


Типичные ошибки и их решения

  1. Пропущен тег <packaging> в pom.xml.
    Если вы не указали <packaging>jar</packaging> (или war), Maven по умолчанию соберёт JAR. Всегда проверяйте этот тег.
  2. Ошибка "No Main Manifest Attribute".
    Это значит, что в созданной сборке отсутствует точка входа. Убедитесь, что файл DemoApplication содержит метод main, и что Spring-Boot-Maven-Plugin добавлен в pom.xml.
  3. WAR не разворачивается на сервере.
    Проверьте, что добавлен класс, наследующий SpringBootServletInitializer.

Вот и всё! Теперь ваше приложение готово к деплою, будь то локальный сервер, облако или контейнерная платформа. В следующих лекциях мы углубимся в тему контейнеризации с помощью Docker.

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ