Spring Загружаемый встроенный tomcat очень удобен для разработки и развертывания.
Но что, если добавить дополнительный (сторонний) WAR файл (например, GeoServer)?
Возможно, следующая нормальная процедура:
- Установите обычный сервер Tomcat.
- Создайте приложение загрузки Spring как WAR файл и добавьте его в папку webapps Tomcat.
- Также добавьте другой (сторонний) WAR файл в папку webapps.
Но было бы неплохо, если бы была возможна следующая конфигурация.
- Создайте загрузочное приложение Spring как автономный Jar, который включает встроенный Tomcat.
- Разверните JAR с загрузочным приложением Spring.
- Добавить другой (сторонний) WAR файл в папку, которую распознает встроенный Tomcat.
- Служите как содержимым загрузочного приложения Spring, так и другим содержимым WAR с помощью встроенного Tomcat.
Как это можно сделать?
UPDATE
Когда загрузочное приложение Spring сделано из жировой банки (= исполняемая банка), кода в ответе недостаточно. Пересмотренный вариант выглядит следующим образом:
@Bean
public EmbeddedServletContainerFactory servletContainerFactory() {
return new TomcatEmbeddedServletContainerFactory() {
@Override
protected TomcatEmbeddedServletContainer getTomcatEmbeddedServletContainer(
Tomcat tomcat) {
try {
Context context = tomcat.addWebapp("/foo", "/path/to/foo.war");
WebappLoader loader =
new WebappLoader(Thread.currentThread().getContextClassLoader());
context.setLoader(loader);
} catch (ServletException ex) {
throw new IllegalStateException("Failed to add webapp", ex);
}
return super.getTomcatEmbeddedServletContainer(tomcat);
}
};
}
Так как файлы jar в контейнере жира не могут быть загружены системным загрузчиком классов, необходимо указать явный родительский загрузчик классов. В противном случае дополнительная WAR не может загружать библиотечные банки в жирную банку приложения загрузки Spring, которое добавило WAR.