Spring boot enable/disable embedded tomcat with profile
Solution 1
Use
@SpringBootApplication(exclude = {EmbeddedServletContainerAutoConfiguration.class,
WebMvcAutoConfiguration.class})
to exclude Spring Boot's auto-configuration for embedded servlet containers. Additionally, you need to set the following property for the non-REST cases, so that Spring Boot won't try to start a WebApplicationContext
(which needs a servlet container):
spring.main.web-environment=false
Then enable the embedded Tomcat in your REST profile by importing EmbeddedServletContainerAutoConfiguration.class
(this delays the autoconfiguration until after the REST profile has been loaded:
@Profile({"REST"})
@Configuration
@Import(EmbeddedServletContainerAutoConfiguration.class)
public class HttpConfiguration {
// ...
}
If you are using any EmbeddedServletContainerCustomizer
s, you also need to import EmbeddedServletContainerCustomizerBeanPostProcessorRegistrar.class
.
Solution 2
As of Spring Boot 2.0 only spring.main.web-application-type=none
in the relevant profile do the trick.
If you use a multi-document application.yml
with Spring Boot 2.0, adding this block and replacing no-web-profile-name
with the profile that shouldn't have an embedded web server should work:
---
spring:
profiles: no-web-profile-name
main:
web-application-type: none
Solution 3
The answers from @hzpz and @orid set me on the right track.
I needed to add
@SpringBootApplication(exclude = {EmbeddedServletContainerAutoConfiguration.class,
WebMvcAutoConfiguration.class})
and set:
spring.main.web-environment=false
in my application.properties
file for the non-Rest cases.
Comments
-
barcom over 4 years
I'm writing a Spring Boot application that uses one of several
@Configuration
classes depending on which@Profile
is set in theapplication.properties
file.One of those Configuration classes uses a REST interface, and therefore I'm including
spring-boot-starter-web
as a dependency.This starts up an embedded Tomcat instance, which is fine.
The problem is, the other profiles don't need an embedded server (e.g. I'm using JMS to handle incoming messages instead of REST).
Is there any way to stop the
@SpringBootApplication
from starting up Tomcat by default, and only using it for the REST Configuration class? E.g., by annotating that class with@EnableWebMVC
Here's an example of my
@Configuration
classes:REST:
@Profile({"REST"}) @Configuration @EnableWebMvc public class HttpConfiguration{ . . . }
JMS:
@Profile({"JMS"}) @Configuration @EnableJms public class JMSConfiguration{ . . . }
Thanks