Вопрос или проблема
Я пытаюсь собрать и запустить свой проект Spring Boot 3.3.5, используя Spring Native.
Зависимости:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.5</version>
<relativePath/> <!-- поиск родителя в репозитории -->
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Плагины:
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<image>
<builder>paketobuildpacks/builder-jammy-buildpackless-tiny</builder>
<buildpacks>
<buildpack>paketobuildpacks/oracle</buildpack>
<buildpack>paketobuildpacks/java-native-image</buildpack>
</buildpacks>
</image>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
Конфигурация:
server:
port: 8080
shutdown: graceful
spring:
main:
web-application-type: servlet
Класс приложения:
@SpringBootApplication
public class ChatbotMemberEventWorkerApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(ChatbotMemberEventWorkerApplication.class, args);
}
}
Dockerfile:
FROM ghcr.io/graalvm/graalvm-community:latest as builder
COPY . /artifact
WORKDIR /artifact
RUN microdnf -y install wget unzip zip findutils tar maven
RUN mvn -Pnative native:compile
FROM container-registry.oracle.com/os/oraclelinux:9-slim
EXPOSE 8080
COPY --from=builder /artifact/target/chatbot-member-event-worker ./chatbot-member-event-worker
ENTRYPOINT ["./chatbot-member-event-worker --spring.profiles.active=local"]
Проблема:
Когда я запускаю приложение, оно запускается, но сразу же завершается. Похоже, что веб-сервер на самом деле не запущен.
Вывод журнала:
INFO 39222 --- [chatbot-member-event-worker] .g.c.ChatbotMemberEventWorkerApplication : Starting AOT-processed ChatbotMemberEventWorkerApplication...
INFO 39222 --- [chatbot-member-event-worker] .g.c.ChatbotMemberEventWorkerApplication : The following 1 profile is active: "local"
Web application could not be started as there was no org.springframework.boot.web.servlet.server.ServletWebServerFactory bean defined in the context.
)
Есть ли какие-либо сведения о том, почему это происходит или как я могу держать сервер запущенным? Спасибо!
Оказывается, это связано с
spring-cloud-starter-bootstrap зависимостью, когда я удаляю это, я успешно
.
Ответ или решение
Ситуация, с которой вы столкнулись при попытке запустить приложение Spring Boot 3.3.5 с использованием Spring Native, связана с отсутствием необходимого компонента для инициализации встроенного веб-сервера в вашем приложении. Давайте разберемся с деталями проблемы и возможными решениями.
Описание проблемы
Вы заметили, что при запуске вашего приложения сервер не запускается, и вы получаете ошибку:
Web application could not be started as there was no org.springframework.boot.web.servlet.server.ServletWebServerFactory bean defined in the context.
Эта ошибка указывает на то, что Spring Boot не может найти бины, отвечающие за запуск встроенного веб-сервера, что непосредственно связано с конфигурацией и зависимостями вашего проекта.
Анализ конфигурации
1. Зависимости
Ваша конфигурация зависимостей выглядит корректно с точки зрения основного стартера Spring Boot для веб-приложений:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Однако вы упомянули, что проблема была решена после удаления зависимости spring-cloud-starter-bootstrap
. Эта зависимость может влиять на контекст приложения и обрабатывать загрузку свойств. При использовании Spring Native важна правильная конфигурация для обеспечения работоспособности всех необходимых компонентов.
2. Основной класс приложения
Ваш основной класс приложения выглядит следующим образом, что также соответствует ожиданиям:
@SpringBootApplication
public class ChatbotMemberEventWorkerApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(ChatbotMemberEventWorkerApplication.class, args);
}
}
Класс явно указывает на тип приложения с помощью аннотации @SpringBootApplication
и расширения SpringBootServletInitializer
, что нужно для запуска приложения как сервлетного.
Решение проблемы
Удаление spring-cloud-starter-bootstrap
Как вы уже заметили, причиной проблемы было наличие зависимости spring-cloud-starter-bootstrap
. Эта библиотека переопределяет поведение загрузки контекста, возможно, блокируя необходимые настройки веб-сервера Spring Boot. Рекомендуется избегать использования этой зависимости, если она не является абсолютно необходимой для вашей архитектуры. Если вам нужна эта библиотека, рассмотрите возможность ее правильной конфигурации, чтобы она не мешала основному контексту.
Альтернативные пути
Если ваша архитектура требует использования Spring Cloud, рассмотрите возможность использования новых подходов:
- Используйте Spring Cloud без
bootstrap
таким образом, чтобы конфигурации загружались самым правильным образом. - Проверьте совместимость используемых версий библиотек. Убедитесь, что все используемые зависимости совместимы друг с другом и с используемыми версиями Spring.
Итог
Проблема, с которой вы столкнулись, связана с конфликтом между используемыми зависимостями и самой конфигурацией Spring Boot. Удаление ненужных зависимостей.
Правильная настройка и согласование всех компонентов системы обеспечат корректную работу вашего приложения. Убедитесь, что применяете актуальные версии библиотек и следите за их совместимостью.
Если после внесения изменений проблема сохраняется, предоставьте дополнительные логи или сообщения об ошибках для более детального анализа.