Spring Boot bez serwera WWW

104

Mam prostą aplikację Spring Boot, która pobiera komunikaty z kolejki JMS i zapisuje niektóre dane w pliku dziennika, ale nie potrzebuje serwera WWW. Czy istnieje sposób na uruchomienie Spring Boot bez serwera WWW?

Michael
źródło
3
Jeśli nie potrzebujesz sieci, nie dołączaj jej, jeśli nie jest dołączona, wbudowany serwer nie uruchomi się. Potrzebowałbyś tylko rodzica startera i dodał spring-jms(chyba) jako zależność. Następnie wystarczy uruchomić aplikację, żaden serwer nie zostanie uruchomiony.
M. Deinum
1
Mylisz się, używam tylko spring-boot-starter-batch, nie załączam żadnej konfiguracji tomcat ani innej konfiguracji serwera w moim pom.xml, jednak wykonanie aplikacji powoduje uruchomienie kontenera internetowego. Musi gdzieś wziąć parametr.
Mehdi

Odpowiedzi:

25

Spring boot nie będzie zawierał osadzonego tomcat, jeśli nie masz zależności Tomcat w ścieżce klas. Możesz sam zobaczyć ten fakt na zajęciach, EmbeddedServletContainerAutoConfigurationktórych źródło znajdziesz tutaj .

Istotą kodu jest użycie @ConditionalOnClassadnotacji w klasieEmbeddedTomcat


Ponadto, aby uzyskać więcej informacji znajdziesz ten i ten przewodnik i tym część dokumentacji

geoand
źródło
W obecnej wersji, gs-convert-jar-to-war/completeprojekt Maven ma dodać wbudowany serwer Tomcat, pomimo spring-boot-starter-tomcatzależność zadeklarowana z zakresu provided. To wygląda na błąd. Zobacz także stackoverflow.com/q/25991789/923560
Abdull
137

jeśli chcesz uruchomić rozruch sprężynowy bez kontenera serwletów, ale z jednym na ścieżce klas (np. do testów), użyj następujących czynności, jak opisano w dokumentacji rozruchu sprężyny :

@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);
    }
}

również natknąłem się na tę właściwość:

spring.main.web-environment=false
Stefan K.
źródło
12
Samo dodanie właściwości do application.propertiesdziała doskonale.
Wim Deblauwe
8
To działa, ale jest przestarzałe w Spring Boot 2.0. Zobacz tę odpowiedź dla wersji 2.0: stackoverflow.com/a/44394305/66686
Jens Schauder
1
Do Twojej wiadomości: ta właściwość spring.main.web-environmentjest teraz przestarzała. Nadal działa dla Boot 2.1.1
Sergey Karpushin
1
Boot 2.x - application.setWebApplicationType (WebApplicationType.NONE);
Michael Munsey
1
To, czego powinieneś teraz używać, tospring.main.web-application-type=none
cholera,
96

Spring Boot 2.x

  • Właściwości aplikacji

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

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

Gdzie WebApplicationType :

  • NONE - Aplikacja nie powinna działać jako aplikacja internetowa i nie powinna uruchamiać wbudowanego serwera internetowego.
  • REACTIVE - Aplikacja powinna działać jako reaktywna aplikacja internetowa i powinna uruchamiać wbudowany reaktywny serwer WWW.
  • SERVLET - Aplikacja powinna działać jako aplikacja internetowa oparta na serwletach i powinna uruchamiać wbudowany serwer sieciowy serwletu.
kinjelom
źródło
54

Możesz stworzyć coś takiego:

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

I

@Component
public class CommandLiner implements CommandLineRunner {

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

}

Zależność nadal istnieje, ale nie jest używana.

sancho21
źródło
Czy możemy bezpiecznie usunąć zależność sprign-boot-starter-web? Na razie wyłączenie aplikacji internetowej i usunięcie tej zależności powoduje wyjątek ClassNotFound: javax.servlet.ServleContext
Simon Logic
Uwaga: rozwiązanie 1 jest przestarzałe
ACV
najlepsza odpowiedź na świecie
prash
7

Dla Spring boot v2.1.3.RELEASE, po prostu dodaj następujące właściwości do application.propertes:

spring.main.web-application-type=none
Chun Hau Lai
źródło
6

Użyj tego kodu.

SpringApplication application = new SpringApplication(DemoApplication.class);
application.setWebApplicationType(WebApplicationType.NONE);
application.run(args);
nayun oh
źródło
3

Jeśli potrzebujesz funkcjonalności sieciowej w swojej aplikacji (np. org.springframework.web.client.RestTemplateDla wywołań REST), ale nie chcesz uruchamiać serwera TOMCAT, po prostu wyklucz go w 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
źródło
3
  • W ramach programu:

    ConfigurableApplicationContext ctx =  new  SpringApplicationBuilder(YourApplicationMain.class)
    .web(WebApplicationType.NONE)
    .run(args);
  • Za pomocą pliku application.properties:

    spring.main.web-environment=false 
  • Poprzez plik application.yml:

    spring:
     main:
      web-environment:false
Sucheth Shivakumar
źródło
2

Jeśli chcesz użyć jednego z szablonów „Getting Started” ze strony spring.io, ale nie potrzebujesz żadnych elementów związanych z serwletami, które są dostarczane z szablonem „default” („gs / spring-boot”), możesz zamiast tego wypróbować szablon planowania zadań (którego pom * zawiera starter spring-boot-starter itp.):

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

Daje to Spring Boot, a aplikacja działa jako samodzielna aplikacja (żadne serwlety, spring-webmvc itp. Nie są zawarte w pom). To jest to, czego chciałeś (chociaż może być konieczne dodanie pewnych rzeczy specyficznych dla JMS, jak ktoś inny już wskazuje).

[* Używam Mavena, ale załóżmy, że kompilacja Gradle będzie działać podobnie].

murmelssonic
źródło
2

Usuń następującą zależność od twojego pliku pom

  <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
vaquar khan
źródło
1

Dla Kotlinga oto czego ostatnio użyłem:


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

I wszystko uruchamia się normalnie, kończąc na powłoce z dostępnym moim niestandardowym poleceniem.

Vincent
źródło
1

Możesz użyć zależności sprężyna-rozruch-rozrusznik. To nie będzie miało treści internetowych.

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter</artifactId>
</dependency>
Roland
źródło
1

W przypadku rozruchu Spring, zależność Spring Web zapewnia wbudowany serwer WWW Apache Tomcat. Jeśli usuniesz zależność spring-boot-starter-web w pom.xml, nie zapewni on wbudowanego serwera internetowego.

usuń następującą zależność

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>
Zakib Ali
źródło
Uwaga: Najlepiej, gdyby początkujący byli rodzicem POM, a nie zależnością
OneCricketeer
0

Podobnie jak @nayun oh answer powyżej, ale w przypadku starszych wersji Spring użyj tego kodu:

SpringApplication application = new SpringApplication(DemoApplication.class);
application.setApplicationContextClass(AnnotationConfigApplicationContext.class);
application.run(args);
Chris Wolf
źródło