Spring Boot sans le serveur Web

104

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 n'a pas besoin d'un serveur Web. Existe-t-il un moyen de démarrer Spring Boot sans le serveur Web?

Michael
la source
3
Si vous n'avez pas besoin de Web, ne l'incluez pas, s'il n'est pas inclus, le serveur intégré ne démarrera pas. Vous n'auriez besoin que du parent de démarrage et l'ajoutez spring-jms(je suppose) en tant que dépendance. Ensuite, lancez simplement l'application, aucun serveur ne sera démarré.
M. Deinum
1
Vous vous trompez, j'utilise uniquement spring-boot-starter-batch, je n'inclus aucune configuration de tomcat ou autre serveur dans mon pom.xml, cependant l'exécution de l'application lance un conteneur Web. Il doit prendre un paramètre quelque part.
Mehdi

Réponses:

25

Spring boot n'inclura pas le 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 EmbeddedServletContainerAutoConfigurationdont vous pouvez trouver la source ici .

La viande du code est l'utilisation de l' @ConditionalOnClassannotation sur la classeEmbeddedTomcat


Aussi, pour plus d'informations, consultez ceci et ce guide et cette partie de la documentation

geoand
la source
Dans sa version actuelle, le gs-convert-jar-to-war/completeprojet Maven n'ajouter un serveur Tomcat intégré, en dépit de la dépendance déclarée avec la portée . Cela ressemble à un bug. Voir également stackoverflow.com/q/25991789/923560spring-boot-starter-tomcatprovided
Abdull
137

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

@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 viens de tomber sur cette propriété:

spring.main.web-environment=false
Stefan K.
la source
12
L'ajout de la propriété application.propertiesfonctionne parfaitement bien.
Wim Deblauwe
8
Cela fonctionne mais est obsolète dans Spring Boot 2.0. Voir cette réponse pour la version 2.0: stackoverflow.com/a/44394305/66686
Jens Schauder
1
FYI: cette propriété spring.main.web-environmentest désormais obsolète.
Fonctionne
1
Boot 2.x - application.setWebApplicationType (WebApplicationType.NONE);
Michael Munsey
1
Ce que vous êtes censé utiliser ces jours-ci, c'estspring.main.web-application-type=none
damd
95

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 s'exécuter en tant qu'application Web et ne doit pas démarrer un serveur Web intégré.
  • REACTIVE - L'application doit s'exécuter en tant qu'application Web réactive et doit démarrer un serveur Web réactif intégré.
  • SERVLET - L'application doit s'exécuter en tant qu'application Web basée sur un servlet et doit démarrer un serveur Web de servlet intégré.
kinjelom
la source
53

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.

sancho21
la source
Pouvons-nous supprimer en toute sécurité la dépendance sprign-boot-starter-web? Pour l'instant, rendre l'application non Web et supprimer cette dépendance provoque une exception ClassNotFound: javax.servlet.ServleContext
Simon Logic
Veuillez noter que la solution 1 est obsolète
ACV
9

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 de Spring boot starter, utilisez la propriété suivante:

spring.main.web-application-type = aucun

Pour obtenir de 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

Mehdi
la source
7

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

spring.main.web-application-type=none
Chun Hau Lai
la source
6

Utilisez ce code.

SpringApplication application = new SpringApplication(DemoApplication.class);
application.setWebApplicationType(WebApplicationType.NONE);
application.run(args);
nayun oh
la source
3

Si vous avez besoin d'une fonctionnalité Web dans votre application (comme org.springframework.web.client.RestTemplatepour les appels REST) ​​mais que vous ne souhaitez pas démarrer un serveur TOMCAT, excluez-la simplement 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>
Paul Rambags
la source
3
  • Grâce au programme:

    ConfigurableApplicationContext ctx =  new  SpringApplicationBuilder(YourApplicationMain.class)
    .web(WebApplicationType.NONE)
    .run(args);
  • Via le fichier application.properties:

    spring.main.web-environment=false 
  • Via le fichier application.yml:

    spring:
     main:
      web-environment:false
Sucheth Shivakumar
la source
2

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

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

Cela vous donne Spring Boot et l'application fonctionne de manière autonome (aucun servlet ou spring-webmvc, etc. n'est inclus dans le pom). C'est ce que vous vouliez (même si vous devrez peut-être ajouter des éléments spécifiques à JMS, comme quelqu'un d'autre le souligne déjà).

[* J'utilise Maven, mais je suppose qu'une version Gradle fonctionnera de la même manière].

murmelssonique
la source
2

Supprimer la dépendance suivante sur votre fichier pom fonctionnera pour moi

  <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
vaquar khan
la source
1

Pour Kotling, voici ce que j'ai utilisé ces derniers temps:


// src/main/com.blabla/ShellApplication.kt

/**
 * Main entry point for the shell application.
 */
@SpringBootApplication
public class ShellApplication : CommandLineRunner {
    companion object {
        @JvmStatic
        fun main(args: Array<String>) {
            val application = SpringApplication(ShellApplication::class.java)
            application.webApplicationType = WebApplicationType.NONE
            application.run(*args);
        }
    }

    override fun run(vararg args: String?) {}
}

// src/main/com.blabla/command/CustomCommand.kt

@ShellComponent
public class CustomCommand {
    private val logger = KotlinLogging.logger {}

    @ShellMethod("Import, create and update data from CSV")
    public fun importCsv(@ShellOption() file: String) {
        logger.info("Hi")
    }
}

Et tout démarre normalement avec un shell avec ma commande personnalisée disponible.

Vincent
la source
1

Vous pouvez utiliser la dépendance spring-boot-starter. Cela n'aura pas le contenu Web.

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter</artifactId>
</dependency>
Roland
la source
1

Dans Spring Boot, Spring Web dependency fournit un serveur Web Apache Tomcat intégré. Si vous supprimez la dépendance spring-boot-starter-web dans le fichier pom.xml, il ne fournit pas de serveur Web intégré.

supprimer la dépendance suivante

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>
Zakib Ali
la source
0

Similaire à @nayun oh réponse ci-dessus, mais pour les anciennes versions de Spring, utilisez ce code:

SpringApplication application = new SpringApplication(DemoApplication.class);
application.setApplicationContextClass(AnnotationConfigApplicationContext.class);
application.run(args);
Chris Wolf
la source