Ho una semplice applicazione Spring Boot che riceve i messaggi da una coda JMS e salva alcuni dati in un file di registro, ma non necessita di un server web. C'è un modo per avviare Spring Boot senza il server web?
Ho una semplice applicazione Spring Boot che riceve i messaggi da una coda JMS e salva alcuni dati in un file di registro, ma non necessita di un server web. C'è un modo per avviare Spring Boot senza il server web?
Risposte:
L'avvio primaverile non includerà tomcat incorporato se non si hanno dipendenze Tomcat dal classpath. Puoi vedere questo fatto tu stesso durante la lezione la EmbeddedServletContainerAutoConfiguration
cui fonte puoi trovare qui .
La carne del codice è l'uso @ConditionalOnClass
dell'annotazione sulla classeEmbeddedTomcat
Inoltre, per maggiori informazioni consulta questa e questa guida e questa parte della documentazione
gs-convert-jar-to-war/complete
progetto di Maven non aggiungere un server Tomcat incorporato, nonostante la spring-boot-starter-tomcat
dipendenza dichiarato con portata provided
. Sembra un bug. Vedere anche stackoverflow.com/q/25991789/923560
se si desidera eseguire spring boot senza un servlet container, ma con uno sul classpath (ad esempio per i test), utilizzare quanto segue, come descritto nella documentazione di spring boot :
@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);
}
}
inoltre, mi sono appena imbattuto in questa proprietà:
spring.main.web-environment=false
application.properties
funzionare perfettamente.
spring.main.web-environment
è ora deprecata. Funziona ancora per 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);
}
}
Dove WebApplicationType :
NONE
- L'applicazione non deve essere eseguita come applicazione Web e non deve avviare un server Web incorporato.REACTIVE
- L'applicazione dovrebbe essere eseguita come un'applicazione web reattiva e dovrebbe avviare un server web reattivo incorporato.SERVLET
- L'applicazione dovrebbe essere eseguita come un'applicazione web basata su servlet e dovrebbe avviare un server web servlet incorporato.
Puoi creare qualcosa di simile:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).web(false).run(args);
}
}
E
@Component
public class CommandLiner implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
// Put your logic here
}
}
La dipendenza è ancora presente ma non utilizzata.
La soluzione più semplice. nel file application.properties. aggiungi la seguente proprietà come menzionato in una risposta precedente:
spring.main.web-environment = false
Per la versione 2.0.0 dell'avviatore Spring Boot, utilizzare la seguente proprietà:
spring.main.web-application-type = nessuno
Per la documentazione su tutte le proprietà utilizzare questo collegamento: https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
Per Spring Boot v2.1.3.RELEASE, aggiungi semplicemente le seguenti proprietà in application.propertes:
spring.main.web-application-type=none
Se hai bisogno di funzionalità web nella tua applicazione (come org.springframework.web.client.RestTemplate
per le chiamate REST) ma non vuoi avviare un server TOMCAT, escludilo semplicemente nel 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>
Attraverso il programma:
ConfigurableApplicationContext ctx = new SpringApplicationBuilder(YourApplicationMain.class)
.web(WebApplicationType.NONE)
.run(args);
Tramite il file application.properties:
spring.main.web-environment=false
Tramite il file application.yml:
spring:
main:
web-environment:false
Se si desidera utilizzare uno dei modelli "Guida introduttiva" dal sito spring.io, ma non è necessario alcun elemento relativo al servlet fornito con il modello "predefinito" ("gs / spring-boot"), puoi provare invece il modello di attività di pianificazione (il cui pom * contiene spring-boot-starter ecc.):
https://spring.io/guides/gs/scheduling-tasks/
Questo ti dà Spring Boot e l'app funziona come standalone (nessun servlet o spring-webmvc ecc. Sono inclusi nel pom). Che è quello che volevi (anche se potresti dover aggiungere alcune cose specifiche di JMS, come già sottolineato da qualcun altro).
[* Sto usando Maven, ma presumo che una build Gradle funzionerà in modo simile].
Rimuovere la seguente dipendenza dal tuo file pom funzionerà per me
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Per Kotling ecco quello che ho usato ultimamente:
// 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")
}
}
E tutto si avvia normalmente finendo con una shell con il mio comando personalizzato disponibile.
Simile a @nayun oh answer sopra, ma per le versioni precedenti di Spring, usa questo codice:
SpringApplication application = new SpringApplication(DemoApplication.class);
application.setApplicationContextClass(AnnotationConfigApplicationContext.class);
application.run(args);
spring-jms
(immagino) come dipendenza. Quindi avvia l'applicazione, nessun server verrà avviato.