J'écris une application Spring Boot qui utilise l'un des nombreux @Configuration
classes selon laquelle @Profile
est défini dans le application.properties
fichier.
L'une de ces classes de configuration utilise une interface REST, et j'inclus donc spring-boot-starter-web
comme dépendance.
Cela démarre une instance Tomcat intégrée, ce qui est bien.
Le problème est que les autres profils n'ont pas besoin d'un serveur intégré (par exemple, j'utilise JMS pour gérer les messages entrants au lieu de REST).
Existe-t-il un moyen d'arrêter le @SpringBootApplication
de démarrer Tomcat par défaut et de ne l'utiliser que pour la classe de configuration REST? Par exemple, en annotant cette classe avec @EnableWebMVC
Voici un exemple de mon @Configuration
Des classes:
DU REPOS:
@Profile({"REST"})
@Configuration
@EnableWebMvc
public class HttpConfiguration{
.
.
.
}
JMS:
@Profile({"JMS"})
@Configuration
@EnableJms
public class JMSConfiguration{
.
.
.
}
Merci
Utilisation
@SpringBootApplication(exclude = {EmbeddedServletContainerAutoConfiguration.class,
WebMvcAutoConfiguration.class})
pour exclure la configuration automatique de Spring Boot pour les conteneurs de servlet intégrés. De plus, vous devez définir la propriété suivante pour les cas non REST, afin que Spring Boot n'essaye pas de démarrer un WebApplicationContext
(qui a besoin d'un conteneur de servlet):
spring.main.web-environment=false
Activez ensuite le Tomcat intégré dans votre profil REST en important EmbeddedServletContainerAutoConfiguration.class
(cela retarde la configuration automatique jusqu'à ce que le profil REST ait été chargé:
@Profile({"REST"})
@Configuration
@Import(EmbeddedServletContainerAutoConfiguration.class)
public class HttpConfiguration {
// ...
}
Si vous utilisez des EmbeddedServletContainerCustomizer
s, vous devez également importer EmbeddedServletContainerCustomizerBeanPostProcessorRegistrar.class
.
Les réponses de @hzpz et @orid m'ont mis sur la bonne voie.
Je devais ajouter
@SpringBootApplication(exclude = {EmbeddedServletContainerAutoConfiguration.class,
WebMvcAutoConfiguration.class})
et mettre:
spring.main.web-environment=false
dans mon application.properties
fichier pour les cas non-Rest.
Depuis Spring Boot 2.0 uniquement spring.main.web-application-type=none
dans le profil correspondant, faites l'affaire.
Si vous utilisez un multi-document application.yml
avec Spring Boot 2.0, en ajoutant ce bloc et en remplaçant no-web-profile-name
avec le profil qui ne devrait pas avoir de serveur Web intégré devrait fonctionner:
---
spring:
profiles: no-web-profile-name
main:
web-application-type: none