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?
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?
Odpowiedzi:
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, EmbeddedServletContainerAutoConfiguration
których źródło znajdziesz tutaj .
Istotą kodu jest użycie @ConditionalOnClass
adnotacji w klasieEmbeddedTomcat
Ponadto, aby uzyskać więcej informacji znajdziesz ten i ten przewodnik i tym część dokumentacji
gs-convert-jar-to-war/complete
projekt Maven ma dodać wbudowany serwer Tomcat, pomimo spring-boot-starter-tomcat
zależność zadeklarowana z zakresu provided
. To wygląda na błąd. Zobacz także stackoverflow.com/q/25991789/923560
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
application.properties
działa doskonale.
spring.main.web-environment
jest teraz przestarzała. Nadal działa dla 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);
}
}
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.
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.
Najprostsze rozwiązanie. w pliku application.properties. dodaj następującą właściwość, jak wspomniano w poprzedniej odpowiedzi:
spring.main.web-environment = false
W przypadku wersji 2.0.0 Spring Boot Starter użyj następującej właściwości:
spring.main.web-application-type = none
Aby uzyskać dokumentację dotyczącą wszystkich nieruchomości, użyj tego łącza: https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
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
Jeśli potrzebujesz funkcjonalności sieciowej w swojej aplikacji (np. org.springframework.web.client.RestTemplate
Dla 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>
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
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].
Usuń następującą zależność od twojego pliku pom
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
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.
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>
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);
spring-jms
(chyba) jako zależność. Następnie wystarczy uruchomić aplikację, żaden serwer nie zostanie uruchomiony.