web-dev-qa-db-fra.com

Spring Boot sans le serveur Web

J'ai une simple application Spring Boot qui récupère les messages d'une file d'attente JMS et enregistre certaines données dans un fichier journal, mais ne nécessite pas de serveur Web. Existe-t-il un moyen de démarrer Spring Boot sans le serveur Web?

61
Michael

Le démarrage de printemps n'inclura pas Tomcat intégré si vous n'avez pas de dépendances Tomcat sur le chemin de classe . Vous pouvez voir ce fait vous-même à la classe EmbeddedServletContainerAutoConfiguration dont vous pouvez trouver le source ici .

La viande du code est l'utilisation de l'annotation @ConditionalOnClass sur la classe EmbeddedTomcat


En outre, pour plus d'informations, consultez this et this guide et this une partie de la documentation

14
geoand

si vous souhaitez exécuter Spring Boot sans conteneur Servlet, mais avec un conteneur sur le chemin de classe (par exemple, pour les tests), utilisez ce qui suit, comme décrit dans la Spring Boot Documentation :

@Configuration
@EnableAutoConfiguration
public class MyClass{
    public static void main(String[] args) throws JAXBException {
                 SpringApplication app = new SpringApplication(MyClass.class);
         app.setWebEnvironment(false); //<<<<<<<<<
         ConfigurableApplicationContext ctx = app.run(args);
    }
}

aussi, je suis tombé sur cette propriété:

spring.main.web-environment=false
102
Stefan K.

Vous pouvez créer quelque chose comme ceci:

@SpringBootApplication
public class Application {
  public static void main(String[] args) {
    new SpringApplicationBuilder(Application.class).web(false).run(args);
  }
}

Et

@Component
public class CommandLiner implements CommandLineRunner {

  @Override
  public void run(String... args) throws Exception {
    // Put your logic here
  }

}

La dépendance est toujours là mais non utilisée.

45
sancho21

Spring Boot 2.x

  • Propriétés de l'application

    spring.main.web-application-type=NONE 
    # REACTIVE, SERVLET
    
  • ou SpringApplicationBuilder

    @SpringBootApplication
    public class MyApplication {
    
        public static void main(String[] args) {
            new SpringApplicationBuilder(MyApplication.class)
                .web(WebApplicationType.NONE) // .REACTIVE, .SERVLET
                .run(args);
       }
    }
    

WebApplicationType :

  • NONE - L'application ne doit pas être exécutée en tant qu'application Web et ne doit pas démarrer un serveur Web intégré.
  • REACTIVE - L'application doit être exécutée en tant qu'application Web réactive et doit démarrer un serveur Web réactif intégré.
  • SERVLET - L'application doit être exécutée en tant qu'application Web basée sur un servlet et doit démarrer un serveur Web de servlet intégré.
37
wildloop

La solution la plus simple. dans votre fichier application.properties. ajoutez la propriété suivante comme mentionné par une réponse précédente:

spring.main.web-environment = false

Pour la version 2.0.0 du démarreur de démarrage Spring, utilisez la propriété suivante:

spring.main.web-application-type = none

Pour la documentation sur toutes les propriétés, utilisez ce lien: https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

4
Mehdi

Si vous souhaitez utiliser l'un des modèles "Mise en route" du site spring.io, mais que vous n'avez besoin d'aucun des éléments relatifs aux servlets fournis avec le modèle "default" ("gs/spring-boot"), vous pouvez essayer le modèle de planification des tâches (dont le pom * contient spring-boot-starter, etc.):

https://spring.io/guides/gs/scheduling-tasks/

Cela vous donne Spring Boot, et l'application s'exécute de manière autonome (aucun servlet ni spring-webmvc, etc. ne sont inclus dans le pom). C’est ce que vous souhaitiez (bien que vous deviez peut-être ajouter des éléments spécifiques à JMS, comme l’a déjà souligné une autre personne).

[* J'utilise Maven, mais supposons qu'une construction Gradle fonctionne de la même manière].

2
murmelssonic

Pour Spring boot v2.1.3.RELEASE, ajoutez simplement les propriétés suivantes dans application.properties:

spring.main.web-application-type=none
1
Chun Hau Lai

Si vous avez besoin de fonctionnalités Web dans votre application (comme org.springframework.web.client.RestTemplate pour les appels REST) mais que vous ne voulez pas démarrer un serveur Tomcat, excluez-le dans le POM:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-Tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
0
Paul Rambags

À travers le programme: ConfigurableApplicationContext ctx = new SpringApplicationBuilder (YourApplicationMain.class) .web (WebApplicationType.NONE) .run (argument);

Dans le fichier application.properties: Spring.main.web-environment = false 

Dans le fichier application.yml: Spring: principale: environnement web: false

0
Sucheth Shivakumar