1. Введение
Spring Boot — это соглашение о структуре конфигурации, которое позволяет нам создать готовую к работе установку проекта Spring, а Tomcat — один из самых популярных контейнеров сервлетов Java.
По умолчанию Spring Boot создает отдельное приложение Java, которое может работать как настольное приложение или настраиваться как системная служба, но есть среды, в которых мы не можем установить новую службу или запустить приложение вручную.
В отличие от автономных приложений, Tomcat устанавливается как служба, которая может управлять несколькими приложениями в рамках одного и того же прикладного процесса, что позволяет избежать необходимости специальной настройки для каждого приложения.
В этом руководстве мы создадим простое приложение Spring Boot и адаптируем его для работы в Tomcat.
2. Настройка приложения Spring Boot
Давайте настроим простое веб-приложение Spring Boot, используя один из доступных начальных шаблонов:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.0</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
Нет необходимости в дополнительных конфигурациях помимо стандартного @SpringBootApplication,
поскольку Spring Boot позаботится о настройке по умолчанию.
Затем мы добавим простую REST EndPoint, чтобы возвращать нам допустимый контент:
@RestController
public class TomcatController {
@GetMapping("/hello")
public Collection<String> sayHello() {
return IntStream.range(0, 10)
.mapToObj(i -> "Hello number " + i)
.collect(Collectors.toList());
}
}
Наконец, мы запустим приложение с помощью mvn spring-boot:run
и запустим браузер по адресу http://localhost:8080/hello
, чтобы проверить результаты.
3. Создание Spring Boot WAR
Контейнеры сервлетов ожидают, что приложения будут развернуты в соответствии с некоторыми контрактами. Для Tomcat контрактом является Servlet API 3.0 .
Чтобы наше приложение соответствовало этому контракту, мы должны внести небольшие изменения в исходный код.
Во-первых, нам нужно упаковать приложение WAR вместо JAR. Для этого мы изменим pom.xml
следующим содержимым:
<packaging>war</packaging>
Далее мы изменим окончательное имя файла WAR
, чтобы не включать номера версий:
<build>
<finalName>${artifactId}</finalName>
...
</build>
Затем мы добавим зависимость Tomcat:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
Наконец, мы инициализируем контекст сервлета, требуемый Tomcat, путем реализации интерфейса SpringBootServletInitializer
:
@SpringBootApplication
public class SpringBootTomcatApplication extends SpringBootServletInitializer {
}
Чтобы создать наше WAR-приложение, развертываемое с помощью Tomcat, мы выполним пакет mvn clean.
После этого наш WAR-файл генерируется по адресу target/spring-boot-deployment.war
(при условии, что артефакт
Maven — «spring-boot-deployment»).
Мы должны учитывать, что эта новая настройка делает наше приложение Spring Boot неавтономным приложением (если мы хотим, чтобы оно снова работало в автономном режиме, мы можем удалить предоставленную
область из зависимости tomcat).
4. Развертывание WAR на Tomcat
Чтобы наш файл WAR был развернут и запущен в Tomcat, нам необходимо выполнить следующие шаги:
Загрузите Apache Tomcat и распакуйте его в папку
tomcat .
Скопируйте наш файл WAR из
target/spring-boot-deployment.war
в папкуtomcat/webapps/
В терминале перейдите в папку
tomcat/bin
и выполнитеcatalina.bat запустить
(в Windows)запуск catalina.sh
(в системах на базе Unix)Перейдите по
адресу http://localhost:8080/spring-boot-deployment/hello.
Это была быстрая установка Tomcat, поэтому ознакомьтесь с полным руководством по установке Tomcat . Существуют также дополнительные способы развертывания WAR-файла на Tomcat .
5. Вывод
В этой краткой статье мы создали простое приложение Spring Boot и превратили его в действительное приложение WAR, которое можно развернуть на сервере Tomcat.
Как всегда, полный исходный код примеров доступен на GitHub .