Каждый разработчик мечтает работать с современными технологиями и идти в ногу со временем. На самом деле, практически невозможно построить сильную стратегию найма вокруг устаревших, неактуальных и часто неэффективных и даже мертворожденных технологий.
Однако жизнь сложна, и не все всегда зависит от наших желаний.
Вам могут предложить повышение и перевести на проект, где технологии не менялись и не обновлялись годами. Или вы можете устроиться на работу в компанию своей мечты, где текущий стек технологий вас сейчас не особенно интересует. Возможно, вы только что окончили университет и хотите получить свой первый опыт работы, или, может быть, вас уволили с предыдущей работы, и вам нужно быстро что-то найти, чтобы избежать финансовых трудностей.
Есть и другой сценарий: во время собеседования вам говорят, что вы начнете работать с текущим стеком, но у вас будет много возможностей внести изменения в будущем — может быть, возможно, но...
Но давайте будем честны, это все просто философия. Я согласен, и предлагаю проанализировать реальный случай, с которым вы можете столкнуться на своем непростом карьерном пути.
Для всех поклонников стека JVM, особенно тех, кто любит Spring Framework, это для вас, пожалуйста, читайте дальше.
Кстати, зачем вам вообще нужно развертывать приложение Spring Boot на сервере приложений, если оно может работать независимо? В конце концов, это одна из выдающихся особенностей Spring Boot.
Итак, причин этому может быть несколько:
Java 8 была выпущена 18 марта 2014 года и принесла с собой важные функции , которые мы используем по сей день.
За примерами далеко ходить не надо, вот лишь некоторые из них:
Лямбда-выражения
API потока
Дополнительный класс
Пакет java.time (API даты и времени)
и т.д. и т.п.
С тех пор и по сей день ( 19.08.2024 ) было выпущено три LTS-версии :
Согласно исследованию, проведенному New Relic , Java 8 по-прежнему используется в 28,8% текущих проектов, что, согласитесь, немало. Хотя ее доля постепенно снижается из года в год, пока еще рано полностью отказываться от этой технологии.
Согласно веб-сайту 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 на данный момент, чтобы попытаться развернуть там свое приложение.
Наверное, довольно сложно найти человека в мире веб-разработки, который хотя бы раз не слышал об этом популярном фреймворке.
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.
Сообщество Spring Boot дает рекомендации по запуску приложения Spring Boot в среде EE + официальная документация
Минимальный и достаточный 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>
Здесь нужно обратить внимание на две вещи:
Я упаковываю приложение в файл War, чтобы серверу приложений было ясно, что я развертываю веб-приложение.
<packaging>war</packaging>
Я исключаю встроенный 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 внутри полученного артефакта. Теперь у вас есть как минимум три варианта запуска полученного артефакта:
domain-dir/autodeploy
asadmin
API - команда развертыванияjava -jar
: spring-boot-maven-plugin создает два артефакта - war
и war.original
. Простой war
включает lib-provided
, original
- нет.Исключение следующих зависимостей позволяет уменьшить размер результирующего артефакта:
<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); } }
Итак, как я уже упоминал выше, две поправки:
@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