Как SpringBoot работает на серверах приложений

Я работаю над переносом наших приложений Spring REST на микросервисы Spring Boot. Сомневаюсь:

Насколько я знаю, у весенней загрузки есть main(), и он вызывает статический run(), который присутствует в SpringApplication. Итак, когда мы запускаем его как «Java Applicaton» в Eclipse IDE, вызывается этот main(), и аннотация @SpringBootApplication творит чудеса. Но когда я развертываю это приложение на серверах приложений Websphere, тогда как это работает, потому что теперь main() не будет вызываться. Затем, как все компоненты загружаются без вызова main().

Серверы WAS - вы имеете в виду службу Windows?

Amit Phaltankar 16.08.2018 07:43

Сервер приложений Websphere

AWS_Developer 16.08.2018 07:44
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
3
2
3 857
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Spring Boot неявно запускает встроенный сервер, который включен в зависимость spring-boot-starter-tomcat. Поэтому метод main() работает в загрузочной среде.

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

Конфигурация разработчика:

@Configuration
@Profile(Profiles.DEV)
@Import(AppConfig.class)
public class Application {

    public static void main(String[] args) {
        new SpringApplicationBuilder(Application.class)
            .profiles(Profiles.DEV)
            .run(args);
    }
}

Разверните конфигурацию (для WAS, tomcat, ...):

@Configuration
@Profile(Profiles.DEPLOY)
@Import(AppConfig.class)
public class ApplicationTomcat extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application
            .profiles(Profiles.DEPLOY)
            .sources(ApplicationTomcat.class);
    }
}

Профили:

public class Profiles {

    public final static String DEV = "dev";

    public final static String DEPLOY = "deploy";
}

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

Таким образом, вы можете развернуть приложение на WAS (или tomcat, ...) стандартным способом и запустить приложение локально также с помощью метода main().

Спасибо за ваш вклад, но все же одно сомнение. Как сервер WAS узнает, является ли это приложение SpringBoot или нет, поскольку нет web.xml no диспетчерский сервлет. Кроме того, как вы сказали, Spring boot запускает встроенный сервер, когда мы развертываем приложение на WAS, затем как SpringBoot работает и загружает bean-компоненты. в этот раз он не будет запускать main (), где присутствует аннотация?

AWS_Developer 16.08.2018 09:42

Это доминанта spring-boot-gradle-plugin или spring-boot-maven-plugin. Оба они переупаковывают приложение под капотом, и все, что вам нужно, это указать вывод jar / war. Вы можете узнать больше об этих плагинах здесь и здесь. Я опубликовал решение, как получить информацию о фактическом развертывании в коде, поэтому вы можете условно указать beans и т. д.

Michal Stepan 16.08.2018 11:41

Спасибо за ваш вклад. Я знаю, как развернуть WAR в WAS с помощью Maven / Gradle. Но все еще не может понять, что WAS загружает компоненты Spring в свой контейнер, поскольку main () не вызывается после развертывания и запуска WAR в WAS.

AWS_Developer 16.08.2018 12:50

Другие вопросы по теме