Spring启用/禁用带有配置文件的嵌入式tomcat

bar*_*com 23 spring tomcat spring-mvc spring-boot

我正在编写一个Spring Boot应用程序,该应用程序使用几个@Configuration类中的一个,具体取决于文件中@Profile设置的类application.properties.

其中一个Configuration类使用REST接口,因此我将其spring-boot-starter-web作为依赖项包含在内.

这启动了一个嵌入式Tomcat实例,这很好.

问题是,其他配置文件不需要嵌入式服务器(例如,我使用JMS来处理传入的消息而不是REST).

有没有办法在@SpringBootApplication默认情况下阻止启动Tomcat,并且只将它用于REST配置类?例如,通过注释该类@EnableWebMVC

这是我的@Configuration课程的一个例子:

休息:

@Profile({"REST"})
@Configuration
@EnableWebMvc
public class HttpConfiguration{
 .
 .
 .
}
Run Code Online (Sandbox Code Playgroud)

JMS:

@Profile({"JMS"})
@Configuration
@EnableJms
public class JMSConfiguration{
 .
 .
 .
}
Run Code Online (Sandbox Code Playgroud)

谢谢

hzp*_*zpz 31

使用

@SpringBootApplication(exclude = {EmbeddedServletContainerAutoConfiguration.class, 
                                  WebMvcAutoConfiguration.class})
Run Code Online (Sandbox Code Playgroud)

排除Spring Boot的嵌入式servlet容器的自动配置.此外,您需要为非REST情况设置以下属性,以便Spring Boot不会尝试启动WebApplicationContext(需要servlet容器):

spring.main.web-environment=false
Run Code Online (Sandbox Code Playgroud)

然后通过导入在REST配置文件中启用嵌入式Tomcat EmbeddedServletContainerAutoConfiguration.class(这会延迟自动配置,直到加载REST配置文件之后:

@Profile({"REST"})
@Configuration
@Import(EmbeddedServletContainerAutoConfiguration.class)
public class HttpConfiguration {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

如果您使用任何EmbeddedServletContainerCustomizers,您还需要导入EmbeddedServletContainerCustomizerBeanPostProcessorRegistrar.class.


bar*_*com 17

来自@hzpz和@orid的答案让我走上正轨.

我需要补充一下

@SpringBootApplication(exclude = {EmbeddedServletContainerAutoConfiguration.class, 
WebMvcAutoConfiguration.class})
Run Code Online (Sandbox Code Playgroud)

并设置:

spring.main.web-environment=false
Run Code Online (Sandbox Code Playgroud)

在我的application.properties文件中为非Rest案例.

  • 很高兴我能帮忙,谢谢你的功劳!但是,作为对我的答案的编辑,你的答案会更好,因为我的答案显然缺少一些关键部分.我自己做了编辑,使其成为您问题的正确答案. (3认同)

frn*_*rno 14

从Spring Boot 2.0开始,只有spring.main.web-application-type=none在相关的配置文件中才能做到这一点.

如果您使用application.yml带有Spring Boot 2.0 的多文档,则添加此块并替换no-web-profile-name不应具有嵌入式Web服务器的配置文件应该可以正常工作:

---
spring:
  profiles: no-web-profile-name
  main:
    web-application-type: none
Run Code Online (Sandbox Code Playgroud)