Distribuire un WAR di Spring Boot in un server Tomcat

1. Introduzione

Spring Boot è una convenzione sul framework di configurazione che ci consente di impostare una configurazione pronta per la produzione di un progetto Spring e Tomcat è uno dei più popolari Java Servlet Containers.

Per impostazione predefinita, Spring Boot crea un'applicazione Java autonoma che può essere eseguita come applicazione desktop o configurata come servizio di sistema, ma esistono ambienti in cui non è possibile installare un nuovo servizio o eseguire l'applicazione manualmente.

A differenza delle applicazioni autonome, Tomcat è installato come un servizio in grado di gestire più applicazioni all'interno dello stesso processo applicativo, evitando la necessità di una configurazione specifica per ciascuna applicazione.

In questa guida creeremo una semplice applicazione Spring Boot e la adatteremo per funzionare all'interno di Tomcat.

2. Configurazione di un'applicazione Spring Boot

Configureremo una semplice applicazione Web Spring Boot utilizzando uno dei modelli di avvio disponibili:

 org.springframework.boot spring-boot-starter-parent 2.2.2.RELEASE     org.springframework.boot spring-boot-starter-web  

Non sono necessarie configurazioni aggiuntive oltre allo standard @SpringBootApplication poiché Spring Boot si occupa della configurazione predefinita.

Aggiungiamo un semplice REST EndPoint per restituirci del contenuto valido:

@RestController public class TomcatController { @GetMapping("/hello") public Collection sayHello() { return IntStream.range(0, 10) .mapToObj(i -> "Hello number " + i) .collect(Collectors.toList()); } }

Ora eseguiamo l'applicazione con mvn spring-boot: esegui e avvia un browser su // localhost: 8080 / hello per controllare i risultati.

3. Creazione di un WAR di Spring Boot

I contenitori servlet si aspettano che le applicazioni soddisfino alcuni contratti per essere distribuiti. Per Tomcat il contratto è Servlet API 3.0.

Affinché la nostra applicazione soddisfi questo contratto, dobbiamo apportare alcune piccole modifiche al codice sorgente.

Per prima cosa, dobbiamo creare un pacchetto di un'applicazione WAR invece di un JAR. Per questo, cambiamo pom.xml con il seguente contenuto:

war

Ora, modifichiamo il nome del file WAR finale per evitare di includere i numeri di versione:

 ${artifactId} ... 

Quindi, aggiungeremo la dipendenza Tomcat:

 org.springframework.boot spring-boot-starter-tomcat provided 

Infine, inizializziamo il contesto Servlet richiesto da Tomcat implementando l' interfaccia SpringBootServletInitializer :

@SpringBootApplication public class SpringBootTomcatApplication extends SpringBootServletInitializer { }

Per creare la nostra applicazione WAR distribuibile con Tomcat, eseguiamo il pacchetto mvn clean. Successivamente, il nostro file WAR viene generato in target / spring-boot-tomcat.war (assumendo che il Maven artifactId sia "spring-boot-tomcat").

Dovremmo considerare che questa nuova configurazione rende la nostra applicazione Spring Boot un'applicazione non standalone (se desideri che funzioni di nuovo in modalità standalone, rimuovi l' ambito fornito dalla dipendenza Tomcat).

4. Distribuzione di WAR su Tomcat

Per fare in modo che il nostro file WAR venga distribuito e in esecuzione in Tomcat, è necessario completare i seguenti passaggi:

  1. Scarica Apache Tomcat e scompattalo in una cartella Tomcat
  2. Copia il nostro file WAR da target / spring-boot-tomcat.war nella cartella tomcat / webapps /
  3. Da un terminale, vai alla cartella tomcat / bin ed esegui
    1. catalina.bat run (su Windows)
    2. catalina.sh run (su sistemi basati su Unix)
  4. Vai a // localhost: 8080 / spring-boot-tomcat / hello

Questa è stata una rapida configurazione di Tomcat, consultare la guida all'installazione di Tomcat per una guida completa all'installazione. Esistono anche altri modi per distribuire un file WAR su Tomcat.

5. conclusione

In questa breve guida, abbiamo creato una semplice applicazione Spring Boot e l'abbiamo trasformata in una valida applicazione WAR distribuibile su un server Tomcat.

Come sempre, il codice sorgente completo degli esempi è disponibile su GitHub.