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




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 (), где присутствует аннотация?
Это доминанта spring-boot-gradle-plugin или spring-boot-maven-plugin. Оба они переупаковывают приложение под капотом, и все, что вам нужно, это указать вывод jar / war. Вы можете узнать больше об этих плагинах здесь и здесь. Я опубликовал решение, как получить информацию о фактическом развертывании в коде, поэтому вы можете условно указать beans и т. д.
Спасибо за ваш вклад. Я знаю, как развернуть WAR в WAS с помощью Maven / Gradle. Но все еще не может понять, что WAS загружает компоненты Spring в свой контейнер, поскольку main () не вызывается после развертывания и запуска WAR в WAS.
Серверы WAS - вы имеете в виду службу Windows?