Если вы упаковываете приложение SpringBoot как jar
, Tomcat будет включен в качестве встроенного контейнера по умолчанию.
Вы не можете попросить встроенный Tomcat разместить несколько веб-приложений, как то, что он может делать как автономная служба.
Итак, у нас есть два варианта:
Запустить обратный прокси-сервер перед вашим приложением SpringBoot. Например, Nginx
Упакуйте ваше приложение SpringBoot как war
и поместите его в какой-нибудь контейнер.
Например:
- Загрузите tomcat и запустите его с конфигурацией по умолчанию.
- Создайте
my-app-1.0.0-SNAPSHOT.war
, переименуйте его в myapp.war
и скопируйте в каталог /webapps
вашего tomcat. - Вы можете посетить
http://localhost:8080/myapp
, tomcat может размещать все допустимые папки и войны в /webapps
.
PS: Если вы используете Spring Reactive Web
(WebFlux, Netty ), второй метод не сработает.
ОБНОВЛЕНИЕ
Вот что я сказал о ServletRegistrationBean
в комментариях.
// use DispatcherServlet here
private ServletRegistrationBean<? extends Servlet> createServletRegistrationBean(
ApplicationContext context, String name, String... urlMappings) {
final DispatcherServlet dispatcherServlet = new DispatcherServlet();
dispatcherServlet.setApplicationContext(context);
final ServletRegistrationBean<DispatcherServlet> servletRegistrationBean =
new ServletRegistrationBean<>(dispatcherServlet, urlMappings);
servletRegistrationBean.setName(name);
return servletRegistrationBean;
}
@Bean
public ServletRegistrationBean<? extends Servlet> oneContextPath(ApplicationContext context) {
// create applicationContext or use the auto configured one
return createServletRegistrationBean(context, "firstOne", "/*");
}
@Bean
public ServletRegistrationBean<? extends Servlet> anotherContextPath(ApplicationContext context) {
return createServletRegistrationBean(context, "secondOne", "/myapp/*");
}
В этом примере мы можем запускать http GET /foo
и http GET /myapp/foo
одновременно.
Примечания:
- WebFlux НЕ поддерживается.
- Пользовательский контекст приложения, если вам нужно.