Spring Boot without the web server

JavaSpring Boot

Java Problem Overview


I have a simple Spring Boot application that gets messages from a JMS queue and saves some data to a log file, but does not need a web server. Is there any way of starting Spring Boot without the web server?

Java Solutions


Solution 1 - Java

if you want to run Spring Boot 1.x without a servlet container, but with one on the classpath (e.g. for tests), use the following, as described in the 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);
	}
}

also, I just stumbled across this property:

spring.main.web-environment=false

Solution 2 - Java

Spring Boot 2.x, 3.x

  • Application Properties

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

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

Where WebApplicationType:

> - NONE - The application should not run as a web application and should not start an embedded web server. > - REACTIVE - The application should run as a reactive web application and should start an embedded reactive web server. > - SERVLET - The application should run as a servlet-based web application and should start an embedded servlet web server.

Solution 3 - Java

You can create something like this:

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

And

@Component
public class CommandLiner implements CommandLineRunner {

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

}

The dependency is still there though but not used.

Solution 4 - Java

Spring boot will not include embedded tomcat if you don't have Tomcat dependencies on the classpath. You can view this fact yourself at the class EmbeddedServletContainerAutoConfiguration whose source you can find here.

The meat of the code is the use of the @ConditionalOnClass annotation on the class EmbeddedTomcat


Also, for more information check out this and this guide and this part of the documentation

Solution 5 - Java

Use this code.

SpringApplication application = new SpringApplication(DemoApplication.class);
application.setWebApplicationType(WebApplicationType.NONE);
application.run(args);

	

Solution 6 - Java

The simplest solution. in your application.properties file. add the following property as mentioned by a previous answer:

> spring.main.web-environment=false

For version 2.0.0 of Spring boot starter, use the following property :

> spring.main.web-application-type=none

For documentation on all properties use this link : https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

Solution 7 - Java

For Spring boot v2.1.3.RELEASE, just add the follow properties into application.propertes:

spring.main.web-application-type=none

Solution 8 - Java

If you need web functionality in your application (like org.springframework.web.client.RestTemplate for REST calls) but you don't want to start a TOMCAT server, just exclude it in the 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>

Solution 9 - Java

  • Through program :

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

      spring.main.web-environment=false 
    
  • Through application.yml file :

      spring:
       main:
        web-environment:false
    

Solution 10 - Java

You can use the spring-boot-starter dependency. This will not have the web stuff.

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter</artifactId>
</dependency>

Solution 11 - Java

Spring boot has many starters, some starters have an embedded web server, some don't. The following have the embedded web server:

spring-boot-starter-web
spring-boot-starter-data-jpa
spring-boot-starter-jetty
spring-boot-starter-tomcat
spring-boot-starter-jdbc
spring-boot-starter-data-rest
...

Pick the one that meets your requirements and that does not have server support.

I only need to make restful json api request in my spring application, so the starter I need is

spring-boot-starter-json

which provide RestTemplate and jackson for me to use.

Solution 12 - Java

If you want to use one of the "Getting Started" templates from spring.io site, but you don't need any of the servlet-related stuff that comes with the "default" ("gs/spring-boot") template, you can try the scheduling-tasks template (whose pom* contains spring-boot-starter etc) instead:

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

That gives you Spring Boot, and the app runs as a standalone (no servlets or spring-webmvc etc are included in the pom). Which is what you wanted (though you may need to add some JMS-specific stuff, as someone else points out already).

[* I'm using Maven, but assume that a Gradle build will work similarly].

Solution 13 - Java

Remove folowing dependancy on your pom file will work for me

  <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

Solution 14 - Java

For Kotling here is what I used lately:


// 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")
    }
}

And everything boot normally ending up with a shell with my custom command available.

Solution 15 - Java

In Spring boot, Spring Web dependency provides an embedded Apache Tomcat web server. If you remove spring-boot-starter-web dependency in the pom.xml then it doesn't provide an embedded web server.

remove the following dependency

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Solution 16 - Java

Similar to @nayun oh answer above, but for older versions of Spring, use this code:

SpringApplication application = new SpringApplication(DemoApplication.class);
application.setApplicationContextClass(AnnotationConfigApplicationContext.class);
application.run(args);

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMichaelView Question on Stackoverflow
Solution 1 - JavaStefan K.View Answer on Stackoverflow
Solution 2 - JavakinjelomView Answer on Stackoverflow
Solution 3 - Javasancho21View Answer on Stackoverflow
Solution 4 - JavageoandView Answer on Stackoverflow
Solution 5 - Javanayun ohView Answer on Stackoverflow
Solution 6 - JavaMehdiView Answer on Stackoverflow
Solution 7 - JavaChun Hau LaiView Answer on Stackoverflow
Solution 8 - JavaPaul RambagsView Answer on Stackoverflow
Solution 9 - JavaSucheth ShivakumarView Answer on Stackoverflow
Solution 10 - JavaRolandView Answer on Stackoverflow
Solution 11 - JavaalijandroView Answer on Stackoverflow
Solution 12 - JavamurmelssonicView Answer on Stackoverflow
Solution 13 - Javavaquar khanView Answer on Stackoverflow
Solution 14 - JavaVincentView Answer on Stackoverflow
Solution 15 - JavaZakib AliView Answer on Stackoverflow
Solution 16 - JavaChris WolfView Answer on Stackoverflow