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

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

Модуль 5. Spring
Рівень 22 , Лекція 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.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ