Тонкі JAR з Spring Boot

Востаннє змінено: 7 квітня 2020 року

баночки

Я щойно оголосив про новий курс Learn Spring, орієнтований на основи Spring 5 та Spring Boot 2:

1. Вступ

У цьому підручнику ми розглянемо як побудувати проект Spring Boot у тонкий файл JAR, використовуючи проект spring-boot-thin-launcher.

Spring Boot відомий своїми розгортаннями JAR, де один виконуваний артефакт містить як код програми, так і всі залежності.

Boot також широко використовується для розробки мікросервісів. Іноді це може суперечити підходу "жирного JAR", оскільки включення одних і тих самих залежностей у багато артефактів може стати важливою витратою ресурсів.

2. Передумови

Перш за все, нам, звичайно, потрібен проект Spring Boot. У цій статті ми розглянемо збірки Maven та збірки Gradle у їх найпоширеніших конфігураціях.

Неможливо охопити всі системи збірки та конфігурації збірки, але, сподіваємось, ми розглянемо достатньо загальних принципів, що ви зможете застосувати їх до своєї конкретної установки.

2.1. Проекти Maven

У проекті завантаження, побудованому за допомогою Maven, нам слід мати плагін Spring Boot Maven, налаштований у файлі pom.xml нашого проекту, його батьківського або одного з його предків:

Версія залежностей Spring Boot зазвичай вирішується за допомогою специфікації або успадкування від батьківського POM, як у нашому довідковому проекті:

2.2. Проекти Gradle

У проекті Boot, побудованому за допомогою Gradle, ми матимемо плагін Boot Gradle:

Зверніть увагу, що в цій статті ми розглядатимемо лише проекти Boot 2.x та пізніші. Thin Launcher також підтримує попередні версії, але для цього потрібна дещо інша конфігурація Gradle, яку ми пропускаємо для простоти. Будь ласка, перегляньте домашню сторінку проекту для отримання детальної інформації.

3. Як створити тонкий JAR?

Тонкий запуск Spring Boot - це невелика бібліотека, яка зчитує залежності артефакту з файлу, що входить до самого архіву, завантажує їх із сховища Maven і, нарешті, запускає основний клас програми.

Так, коли ми будуємо проект з бібліотекою, ми отримуємо файл JAR з нашим кодом, файл, що перераховує його залежності, і основний клас з бібліотеки, яка виконує вищезазначені завдання.

Звичайно, речі дещо витонченіші, ніж наше спрощене пояснення; ми детально обговоримо деякі теми далі в статті.

4. Основне використання

Давайте тепер подивимося, як створити “тонкий” JAR із нашого звичайного додатка Spring Boot.

Ми запустимо додаток із звичайним java -jar, з додатковими додатковими аргументами командного рядка, які контролюють Thin Launcher. Ми побачимо пару з них у наступних розділах; Домашня сторінка проекту містить повний список.

4.1. Проекти Maven

У проекті Maven ми повинні змінити декларацію плагіна Boot (див. Розділ 2.1), щоб включити залежність від власної "тонкої" розкладки:

Запуск запускає зчитування залежностей із файлу pom.xml, який Maven зберігає у створеному JAR у каталозі META-INF/maven.

Будемо виконувати збірку, як зазвичай, наприклад, при встановленні mvn.

Якщо ми хочемо мати змогу створювати як тонкі, так і жирові склади (наприклад, у проекті з декількома модулями), ми можемо оголосити власний макет у спеціальному профілі Maven.

4.2. Maven та залежності: тонкі властивості

Ми також можемо змусити Maven створити файл thin.properties на додаток до pom.xml. У цьому випадку файл буде містити повний список залежностей, включаючи перехідні, і панель запуску віддасть перевагу йому перед pom.xml.

Mojo (плагін) для цього - spring-boot-thin-maven-plugin: properties, і за замовчуванням виводить файл thin.properties у src/main/resources/META-INF, але ми можемо вказати його розташування за допомогою властивість thin.output:

Зверніть увагу, що вихідний каталог повинен існувати для досягнення цілі, навіть якщо ми зберегли стандартний.

4.3. Проекти Gradle

Натомість у проект Gradle ми додаємо виділений плагін:

Щоб отримати тонку збірку, ми скажемо Gradle виконати завдання thinJar:

4.4. Gradle та залежності: pom.xml

У прикладі коду в попередньому розділі ми оголосили плагін Maven на додаток до Thin Launcher (а також плагіни Boot and Dependency Management, які ми вже бачили в розділі Prerequisites).

Це тому, що, як і у випадку з Maven, який ми бачили раніше, артефакт міститиме і використовуватиме файл pom.xml, що перераховує залежності програми. Файл pom.xml генерується завданням з назвою thinPom, що є неявною залежністю будь-якого завдання jar.

Ми можемо налаштувати згенерований файл pom.xml за допомогою спеціального завдання. Тут ми просто повторимо те, що тонкий плагін вже робить автоматично:

Щоб використовувати наш власний файл pom.xml, ми додаємо вищезазначене завдання до залежностей завдання jar:

4.5. Градл та залежності: тонкі властивості

Ми також можемо змусити Gradle генерувати файл thin.properties, а не pom.xml, як ми робили раніше з Maven.

Завдання, яке генерує файл thin.properties, називається thinProperties, і воно не використовується за замовчуванням. Ми можемо додати це як залежність завдання jar:

5. Зберігання залежностей

Вся суть тонких банок полягає у тому, щоб уникнути зв’язування залежностей із додатком. Однак залежності магічним чином не зникають, вони просто зберігаються в інших місцях.

Зокрема, Thin Launcher використовує інфраструктуру Maven для вирішення залежностей, тому:

    він перевіряє локальне сховище Maven, яке за замовчуванням лежить у

/.m2/repository, але може бути переміщений в інше місце;

  • потім завантажує відсутні залежності з Maven Central (або будь-якого іншого налаштованого сховища);
  • нарешті, він кешує їх у локальному сховищі, так що не доведеться завантажувати їх знову при наступному запуску програми.
  • Звичайно, етап завантаження - це повільна та схильна до помилок частина процесу, оскільки для цього потрібен доступ до Maven Central через Інтернет або доступ до локального проксі-сервера, і ми всі знаємо, як ці речі взагалі ненадійні.

    На щастя, існують різні способи розгортання залежностей разом із додатком (додатками), наприклад, у розфасованому контейнері для хмарного розгортання.

    5.1. Запуск програми для розминки

    Найпростіший спосіб кешувати залежності - це виконати прогрів програми в цільовому середовищі. Як ми вже бачили раніше, це призведе до того, що залежності будуть завантажені та кешовані в локальному сховищі Maven. Якщо ми запустимо більше однієї програми, репозиторій у підсумку буде містити всі залежності без дублікатів.

    Оскільки запуск програми може мати небажані побічні ефекти, ми також можемо виконати "сухий запуск", який лише вирішує та завантажує залежності, не запускаючи жодного коду користувача:

    Зверніть увагу, що згідно з умовами Spring Boot, ми можемо встановити властивість -Dthin.dryrun також за допомогою аргументу командного рядка –thin.dryrun для програми або за допомогою системної властивості THIN_DRYRUN. Будь-яке значення, крім false, дасть вказівку Thin Launcher виконати сухий запуск.

    5.2. Пакування залежностей під час побудови

    Інший варіант - зібрати залежності під час побудови, не згрупуючи їх у JAR. Потім ми можемо скопіювати їх у цільове середовище як частину процедури розгортання.

    Як правило, це простіше, оскільки не потрібно запускати додаток у цільовому середовищі. Однак, якщо ми розгортаємо кілька програм, нам доведеться об’єднати їх залежності вручну або за допомогою сценарію.

    Формат, в якому тонкий плагін для Maven і Gradle пакує залежності під час побудови, такий же, як локальний репозиторій Maven:

    Насправді ми можемо спрямувати додаток, використовуючи Thin Launcher, на будь-який такий каталог (включаючи локальне сховище Maven) під час виконання із властивістю thin.root:

    Ми також можемо безпечно об’єднати кілька таких каталогів, копіюючи їх один над одним, отримуючи таким чином сховище Maven з усіма необхідними залежностями.

    5.3. Пакування залежностей за допомогою Maven

    Щоб Maven пакував залежності для нас, ми використовуємо ціль вирішення плагіна spring-boot-thin-maven-plugin. Ми можемо викликати це вручну або автоматично в нашому pom.xml:

    Після побудови проекту ми знайдемо каталог target/thin/root/зі структурою, яку ми обговорювали в попередньому розділі.

    5.4. Пакування залежностей за допомогою Gradle

    Якщо ми використовуємо Gradle з плагіном для запуску тонких панелей, натомість ми маємо доступне завдання thinResolve. Завдання збереже програму та її залежності у каталозі build/thin/root /, аналогічно плагіну Maven у попередньому розділі:

    Зверніть увагу, що на момент написання статті плагін тонкого запуску мав помилку, яка перешкоджає збереженню залежностей, якщо використовується thin.properties: https://github.com/dsyer/spring-boot-thin-launcher/ випуски/53.

    6. Висновки та подальше читання

    У цій статті ми розглянули, як зробити нашу тонку баночку. Ми також бачили, як використовувати інфраструктуру Maven для завантаження та зберігання їх залежностей.

    На домашній сторінці тонкої панелі запуску є ще кілька посібників HOW-TO для таких сценаріїв, як хмарне розгортання Heroku, а також повний список підтримуваних аргументів командного рядка.

    Реалізацію всіх прикладів Maven та фрагментів коду можна знайти в проекті GitHub - як проект Maven, тому його слід легко імпортувати та запускати як є.

    Подібним чином усі приклади Gradle посилаються на цей проект GitHub.