На каком сервере запускается приложение на Spring Boot
Что проверяют
Знаете ли вы, что Spring Boot это не сервер, а приложение, которое поднимает сервер само. Заодно смотрят, деплоили ли вы что-нибудь дальше запуска из IDE: вопрос про сервер быстро переходит в вопрос про упаковку и конфигурацию.
Как отвечать
Стартер spring-boot-starter-web тянет встроенный Tomcat, и обычное приложение это исполняемый jar с сервером внутри: java -jar app.jar поднимает контейнер сервлетов в том же процессе. Альтернативы подключаются заменой стартера: исключить spring-boot-starter-tomcat и добавить Jetty или Undertow. На spring-boot-starter-webflux сервер по умолчанию другой, Netty, и модель обработки неблокирующая.
Порт и прочее настраивается снаружи:
server.port=8081Либо аргументом запуска --server.port=8081. Значение server.port=0 даёт случайный свободный порт, именно это использует @SpringBootTest(webEnvironment = RANDOM_PORT), чтобы параллельные тесты не дрались за порт.
Деплой во внешний сервер приложений тоже возможен и иногда навязан корпоративным стандартом: упаковка в war, главный класс наследуется от SpringBootServletInitializer и переопределяет configure, а стартер Tomcat переводится в область видимости provided, чтобы сервер не уехал внутрь архива. Стоит добавить, что в контейнерах так уже почти не делают: образ с jar внутри проще, чем образ с сервером приложений и выкладкой war в него.
Где спотыкаются
Говорят «Spring Boot работает на Tomcat», как будто это свойство фреймворка. Tomcat это обычная зависимость по умолчанию, её меняют одной правкой сборки, и на реактивном стеке её там изначально нет.
Второе: собирают war, не переведя стартер сервера в provided. Сервлет-API оказывается и в архиве, и в контейнере, приложение падает на старте конфликтом классов, а причину ищут в коде.
Третье: путают порт приложения с портом actuator (management.server.port) или пишут -Dserver.port=8081 после имени jar. После имени архива это уже не системное свойство, а аргумент программы, и Spring его в таком виде не читает: системные свойства идут до -jar, а аргументы приложения задаются через два дефиса.