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?
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?
Antworten:
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, EmbeddedServletContainerAutoConfiguration
deren Quelle Sie hier finden .
Das Fleisch des Codes ist die Verwendung der @ConditionalOnClass
Anmerkung zur KlasseEmbeddedTomcat
Weitere Informationen finden Sie in diesem und diesem Handbuch sowie in diesem Teil der Dokumentation
gs-convert-jar-to-war/complete
Maven - Projekt hat einen eingebetteten Tomcat - Server hinzufügen, trotz der spring-boot-starter-tomcat
Abhängigkeit mit Gültigkeitsbereich deklariert provided
. Das fühlt sich an wie ein Käfer. Siehe auch stackoverflow.com/q/25991789/923560
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
application.properties
funktioniert einwandfrei.
spring.main.web-environment
ist jetzt veraltet. Funktioniert immer noch für Boot 2.1.1
spring.main.web-application-type=none
spring.main.web-application-type=NONE
# REACTIVE, SERVLET
@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.
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.
Die einfachste Lösung. in Ihrer application.properties-Datei. Fügen Sie die folgende Eigenschaft hinzu, wie in einer vorherigen Antwort erwähnt:
spring.main.web-environment = false
Verwenden Sie für Version 2.0.0 von Spring Boot Starter die folgende Eigenschaft:
spring.main.web-application-type = keine
Verwenden Sie zur Dokumentation aller Eigenschaften diesen Link: https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
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
Wenn Sie in Ihrer Anwendung Webfunktionen benötigen (wie org.springframework.web.client.RestTemplate
bei 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>
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
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].
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>
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.
Ä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);
spring-jms
(ich denke) als Abhängigkeit hinzufügen . Dann starten Sie einfach die Anwendung, es wird kein Server gestartet.