Сьогодні поговоримо про те, як перетворити ваш 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.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ