Spring Boot ohne Webserver

100

Ich habe eine einfache Spring Boot-Anwendung, die Nachrichten aus einer JMS-Warteschlange abruft und einige Daten in einer Protokolldatei speichert, aber keinen Webserver benötigt. Gibt es eine Möglichkeit, Spring Boot ohne den Webserver zu starten?

Michael
quelle
3
Wenn Sie kein Web benötigen, schließen Sie es nicht ein. Wenn es nicht enthalten ist, wird der eingebettete Server nicht gestartet. Sie würden nur das übergeordnete Starter-Element benötigen und spring-jms(ich denke) als Abhängigkeit hinzufügen . Dann starten Sie einfach die Anwendung, es wird kein Server gestartet.
M. Deinum
1
Sie liegen falsch, ich verwende nur Spring-Boot-Starter-Batch, ich füge keine Tomcat- oder andere Serverkonfiguration in meine pom.xml ein, aber beim Ausführen der Anwendung wird ein Webcontainer gestartet. Es muss irgendwo einen Parameter annehmen.
Mehdi

Antworten:

24

Spring Boot enthält kein eingebettetes Tomcat, wenn Sie keine Tomcat-Abhängigkeiten vom Klassenpfad haben. Sie können diese Tatsache selbst in der Klasse anzeigen, EmbeddedServletContainerAutoConfigurationderen Quelle Sie hier finden .

Das Fleisch des Codes ist die Verwendung der @ConditionalOnClassAnmerkung zur KlasseEmbeddedTomcat


Weitere Informationen finden Sie in diesem und diesem Handbuch sowie in diesem Teil der Dokumentation

geoand
quelle
In der aktuellen Version, die gs-convert-jar-to-war/completeMaven - Projekt hat einen eingebetteten Tomcat - Server hinzufügen, trotz der spring-boot-starter-tomcatAbhängigkeit mit Gültigkeitsbereich deklariert provided. Das fühlt sich an wie ein Käfer. Siehe auch stackoverflow.com/q/25991789/923560
Abdull
136

Wenn Sie Spring Boot ohne Servlet-Container ausführen möchten, jedoch mit einem im Klassenpfad (z. B. für Tests), verwenden Sie Folgendes, wie in der Spring Boot-Dokumentation beschrieben :

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

Außerdem bin ich gerade über diese Eigenschaft gestolpert:

spring.main.web-environment=false
Stefan K.
quelle
12
Nur das Hinzufügen der Eigenschaft zu application.propertiesfunktioniert einwandfrei.
Wim Deblauwe
8
Dies funktioniert, ist jedoch in Spring Boot 2.0 veraltet. Siehe diese Antwort für die Version 2.0: stackoverflow.com/a/44394305/66686
Jens Schauder
1
Zu Ihrer Information: Diese Eigenschaft spring.main.web-environmentist jetzt veraltet. Funktioniert immer noch für Boot 2.1.1
Sergey Karpushin
1
Boot 2.x - application.setWebApplicationType (WebApplicationType.NONE);
Michael Munsey
1
Was Sie heutzutage verwenden sollen, istspring.main.web-application-type=none
verdammt
94

Spring Boot 2.x.

  • Anwendungseigenschaften

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

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

Wo WebApplicationType :

  • NONE - Die Anwendung sollte nicht als Webanwendung ausgeführt werden und keinen eingebetteten Webserver starten.
  • REACTIVE - Die Anwendung sollte als reaktive Webanwendung ausgeführt werden und einen eingebetteten reaktiven Webserver starten.
  • SERVLET - Die Anwendung sollte als Servlet-basierte Webanwendung ausgeführt werden und einen eingebetteten Servlet-Webserver starten.
Kinjelom
quelle
53

Sie können so etwas erstellen:

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

Und

@Component
public class CommandLiner implements CommandLineRunner {

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

}

Die Abhängigkeit ist zwar noch vorhanden, wird aber nicht verwendet.

sancho21
quelle
Können wir die Abhängigkeit von Sprign-Boot-Starter-Web sicher entfernen? Wenn Sie die App jetzt nicht über das Internet erstellen und diese Abhängigkeit entfernen, wird eine Ausnahme ausgelöst. ClassNotFound: javax.servlet.ServleContext
Simon Logic
Bitte beachten Sie, Lösung 1 ist veraltet
ACV
7

Fügen Sie für Spring Boot v2.1.3.RELEASE einfach die folgenden Eigenschaften zu application.propertes hinzu:

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

Verwenden Sie diesen Code.

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

Wenn Sie in Ihrer Anwendung Webfunktionen benötigen (wie org.springframework.web.client.RestTemplatebei REST-Aufrufen), aber keinen TOMCAT-Server starten möchten, schließen Sie ihn einfach im POM aus:

<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
quelle
3
  • Durch Programm:

    ConfigurableApplicationContext ctx =  new  SpringApplicationBuilder(YourApplicationMain.class)
    .web(WebApplicationType.NONE)
    .run(args);
  • Über die Datei application.properties:

    spring.main.web-environment=false 
  • Über die Datei application.yml:

    spring:
     main:
      web-environment:false
Sucht Shivakumar
quelle
2

Wenn Sie eine der Vorlagen "Erste Schritte" von der spring.io-Site verwenden möchten, aber keine Servlet-bezogenen Inhalte benötigen, die mit der Vorlage "Standard" ("gs / spring-boot") geliefert werden, Sie können stattdessen die Scheduling-Tasks-Vorlage (deren pom * Spring-Boot-Starter usw. enthält) ausprobieren:

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

Das gibt Ihnen Spring Boot und die App läuft als Standalone (keine Servlets oder Spring-Webmvc usw. sind im POM enthalten). Welches ist, was Sie wollten (obwohl Sie möglicherweise einige JMS-spezifische Dinge hinzufügen müssen, wie bereits jemand anderes betont).

[* Ich verwende Maven, gehe aber davon aus, dass ein Gradle-Build ähnlich funktioniert].

murmelssonic
quelle
2

Das Entfernen der folgenden Abhängigkeit von Ihrer POM-Datei funktioniert für mich

  <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
Vaquar Khan
quelle
1

Für Kotling habe ich in letzter Zeit Folgendes verwendet:


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

Und alles, was normalerweise startet, endet mit einer Shell, für die mein benutzerdefinierter Befehl verfügbar ist.

Vincent
quelle
0

Ähnlich wie bei @nayun oh Antwort oben, aber für ältere Versionen von Spring verwenden Sie diesen Code:

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

Sie können die Spring-Boot-Starter-Abhängigkeit verwenden. Dies wird nicht das Web-Zeug haben.

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