paint-brush
Назад в будущее: запуск Spring Boot 2 в GlassFish 4 с использованием Java 8к@isharipov
339 чтения
339 чтения

Назад в будущее: запуск Spring Boot 2 в GlassFish 4 с использованием Java 8

к ILia Sharipov8m2024/08/26
Read on Terminal Reader

Слишком долго; Читать

Каждый разработчик мечтает работать с современными технологиями и идти в ногу со временем. На самом деле, практически невозможно построить сильную стратегию найма вокруг устаревших, неактуальных и часто неэффективных технологий. Spring Boot можно использовать для развертывания приложений на сервере приложений, когда он может работать независимо. Java 8 по-прежнему используется в 28% текущих проектов.
featured image - Назад в будущее: запуск Spring Boot 2 в GlassFish 4 с использованием Java 8
ILia Sharipov HackerNoon profile picture
0-item

Отрицание, Гнев, Торг, Депрессия…

Каждый разработчик мечтает работать с современными технологиями и идти в ногу со временем. На самом деле, практически невозможно построить сильную стратегию найма вокруг устаревших, неактуальных и часто неэффективных и даже мертворожденных технологий.


Однако жизнь сложна, и не все всегда зависит от наших желаний.


Вам могут предложить повышение и перевести на проект, где технологии не менялись и не обновлялись годами. Или вы можете устроиться на работу в компанию своей мечты, где текущий стек технологий вас сейчас не особенно интересует. Возможно, вы только что окончили университет и хотите получить свой первый опыт работы, или, может быть, вас уволили с предыдущей работы, и вам нужно быстро что-то найти, чтобы избежать финансовых трудностей.


Есть и другой сценарий: во время собеседования вам говорят, что вы начнете работать с текущим стеком, но у вас будет много возможностей внести изменения в будущем — может быть, возможно, но...


Принятие…

Но давайте будем честны, это все просто философия. Я согласен, и предлагаю проанализировать реальный случай, с которым вы можете столкнуться на своем непростом карьерном пути.


Для всех поклонников стека JVM, особенно тех, кто любит Spring Framework, это для вас, пожалуйста, читайте дальше.


Кстати, зачем вам вообще нужно развертывать приложение Spring Boot на сервере приложений, если оно может работать независимо? В конце концов, это одна из выдающихся особенностей Spring Boot.


Итак, причин этому может быть несколько:

  1. Возможно, у вас уже есть настроенная инфраструктура для развертывания приложений в GlassFish или другом сервере приложений EE. В этом случае сервер приложений EE установлен, настроен и полностью поддерживается. Даже если приложение может работать независимо, как это происходит с Spring Boot, вам все равно нужно подготовить и поддерживать инфраструктуру для развертывания и выполнения.
  2. Вы знаете, что через некоторое время вы начнете отказываться от сервера приложений и поэтому заранее начинаете использовать технологию, которую вы будете использовать в будущем с возможностью ее использования в текущей среде
  3. Различный опыт и знания в команде
  4. Эксперименты и проверка гипотез

Ява 8

Java 8 была выпущена 18 марта 2014 года и принесла с собой важные функции , которые мы используем по сей день.

За примерами далеко ходить не надо, вот лишь некоторые из них:

  • Лямбда-выражения

  • API потока

  • Дополнительный класс

  • Пакет java.time (API даты и времени)

  • и т.д. и т.п.


С тех пор и по сей день ( 19.08.2024 ) было выпущено три LTS-версии :

  • Java SE 11(55) - 25 сентября 2018 г.
  • Java SE 17(61) - 14 сентября 2021 г.
  • Java SE 21(65) — 19 сентября 2023 г.


Согласно исследованию, проведенному New Relic , Java 8 по-прежнему используется в 28,8% текущих проектов, что, согласитесь, немало. Хотя ее доля постепенно снижается из года в год, пока еще рано полностью отказываться от этой технологии.

https://newrelic.com/resources/report/2024-state-of-the-java-ecosystem

GlassFish 4.1.2

Согласно веб-сайту Project Eclipse, посвященному Eclipse GlassFish :


Eclipse GlassFish® — это полноценный сервер приложений, реализующий спецификацию Jakarta EE. GlassFish включает в себя реализации всех обязательных и дополнительных API Jakarta EE и проходит все TCK Jakarta EE. GlassFish также включает в себя полноценную консоль администрирования, поддержку кластеризации и другие инструменты и функции, ориентированные на разработку и производство.


К сожалению, с этого сайта невозможно скачать версию младше 5.1.0, но поскольку мы решили использовать версию ниже пятой, то придется зайти на сайт Oracle , где в разделе Downloads вы найдете несколько более ранних версий этого продукта. Но будьте осторожны с лицензией и не используйте ничего из этой папки вне своей песочницы.


Просто поместите файл дистрибутива в любое место на вашем компьютере, перейдите в папку bin и выполните следующую команду:

 ./asadmin start-domain --verbose


Подождите немного и попробуйте открыть http://localhost:4848/ , консоль администратора должна быть доступна по умолчанию и не должна запрашивать никаких учетных данных. На левой панели вы найдете вкладку Приложения, если вы нажмете на нее, у вас будет доступ к меню, с помощью которого вы можете развертывать, отменять развертывание, включать и отключать приложения.


Это все, что вам нужно знать о GlassFish на данный момент, чтобы попытаться развернуть там свое приложение.

Пружинный ботинок 2

Наверное, довольно сложно найти человека в мире веб-разработки, который хотя бы раз не слышал об этом популярном фреймворке.

Spring Boot 2 был выпущен в 2021 году и требует Java 8 в качестве минимальной версии, в отличие от версии 3, которая требует Java 17 в качестве минимальной версии .


Чтобы иметь возможность использовать новейшие функции, исправления безопасности и некоторые оптимизации, нам необходимо найти последнюю версию, которая поддерживает Java 8.


И вот она, 2.7.18, согласно их блогу , 2.7.18 стала последней версией с поддержкой Spring Boot 2.x и соответственно Java 8 и Java 11:

После 5,5 лет и 121 релиза, 2.7.18 знаменует собой конец поддержки открытого исходного кода для Spring Boot 2.x. Пожалуйста, обновитесь до Spring Boot 3 как можно скорее. Если вы еще не готовы к обновлению, доступна коммерческая поддержка Spring Boot 2.7.x.

Начинаем использовать их вместе

Предварительные условия:

  • Ява 8
  • GlassFish 4.1.2
  • Пружинный ботинок 2.7.18
  • Знаток


Сообщество Spring Boot дает рекомендации по запуску приложения Spring Boot в среде EE + официальная документация

pom.xml

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


 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.18</version> <relativePath/> </parent> <groupId>io.github.isharipov</groupId> <artifactId>sb2-to-gf4</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <exclusions> <exclusion> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-el</artifactId> </exclusion> <exclusion> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-websocket</artifactId> </exclusion> </exclusions> <scope>provided</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>


Здесь нужно обратить внимание на две вещи:

  1. Я упаковываю приложение в файл War, чтобы серверу приложений было ясно, что я развертываю веб-приложение.


     <packaging>war</packaging>


  1. Я исключаю встроенный Tomcat, добавляя зависимость spring-boot-starter-tomcat, исключая две внутренние зависимости и добавляя предоставленную область действия


     <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <exclusions> <exclusion> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-el</artifactId> </exclusion> <exclusion> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-websocket</artifactId> </exclusion> </exclusions> <scope>provided</scope> </dependency>


Этот подход позволяет вам включить Tomcat и сделать его доступным только для среды выполнения Spring Boot, что позволяет вам запускать приложение независимо от сервера приложений. Это разделение важно. Spring помещает эту зависимость в отдельную папку с именем lib-provided внутри полученного артефакта. Теперь у вас есть как минимум три варианта запуска полученного артефакта:


  • Развертывание в GlassFish. По сути, существует три способа развертывания приложения :
    • Графический интерфейс администратора GlassFish
    • Скопируйте файл архива в каталог autodeploy в domain-dir/autodeploy
    • asadmin API - команда развертывания
  • Запуск с использованием java -jar : spring-boot-maven-plugin создает два артефакта - war и war.original . Простой war включает lib-provided , original - нет.
  • Запустите приложение в вашей любимой среде IDE — для IntelliJ IDEA Community Edition вам необходимо добавить следующую опцию в разделе «Конфигурация запуска/отладки»

Исключение следующих зависимостей позволяет уменьшить размер результирующего артефакта:


 <exclusion> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-el</artifactId> </exclusion> <exclusion> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-websocket</artifactId> </exclusion>


Класс приложения

Чтобы запустить приложение Spring Boot на сервере приложений, вам необходимо внести два изменения в основной класс приложения.

Обычно для настройки простого веб-приложения создается открытый класс с main методом и аннотируется с помощью @SpringBootApplication .


 @SpringBootApplication public class Application { private static final Logger LOGGER = LoggerFactory.getLogger(Application.class); public static void main(String[] args) { SpringApplication.run(Application.class, args); } }


Итак, как я уже упоминал выше, две поправки:


  1. Наследовать класс приложения от SpringBootServletInitializer
  2. Переопределить защищенный метод SpringApplicationBuilder configure(SpringApplicationBuilder builder)


 @SpringBootApplication public class Application extends SpringBootServletInitializer { private static final Logger LOGGER = LoggerFactory.getLogger(Application.class); public static void main(String[] args) { LOGGER.debug("From main"); SpringApplication.run(Application.class, args); } @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { LOGGER.debug("From configure"); return application.sources(Application.class); } }


Дескриптор развертывания

И последнее, но не менее важное: вам нужно добавить Deployment Descriptor.

Итак, в папку main → src → webapp → WEB-INF необходимо поместить следующий файл - glassfish-web.xml :


 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd"> <glassfish-web-app> <class-loader delegate="false"/> <session-config> <session-manager/> </session-config> <jsp-config/> </glassfish-web-app>


Подробнее о дескрипторе развертывания

Узнайте больше о делегировании Class Loader

Подведение итогов

  1. Не бойтесь использовать старые технологии
  2. Оставайтесь любознательными и продолжайте развивать свои навыки
  3. Удачи



GitHub

LinkedIn