Distribuer en Spring Boot WAR i en Tomcat Server

1. Introduksjon

Spring Boot er en konvensjon over konfigurasjonsrammeverk som lar oss sette opp et produksjonsklar oppsett av et Spring-prosjekt, og Tomcat er en av de mest populære Java Servlet Containers.

Som standard bygger Spring Boot et frittstående Java-program som kan kjøre som et skrivebordsprogram eller konfigureres som en systemtjeneste, men det er miljøer der vi ikke kan installere en ny tjeneste eller kjøre applikasjonen manuelt.

I motsetning til frittstående applikasjoner er Tomcat installert som en tjeneste som kan administrere flere applikasjoner i samme applikasjonsprosess, og unngå behovet for et spesifikt oppsett for hver applikasjon.

I denne veiledningen skal vi lage en enkel Spring Boot-applikasjon og tilpasse den til å fungere innen Tomcat.

2. Sette opp et Spring Boot-program

Vi skal sette opp en enkel Spring Boot-nettapplikasjon ved hjelp av en av de tilgjengelige startmaler:

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

Det er ikke behov for flere konfigurasjoner utover standarden @SpringBootApplication siden Spring Boot tar seg av standardoppsettet.

Vi legger til en enkel REST EndPoint for å returnere noe gyldig innhold for oss:

@RestController offentlig klasse TomcatController {@GetMapping ("/ hallo") offentlig samling sayHello () {return IntStream.range (0, 10) .mapToObj (i -> "Hello number" + i) .collect (Collectors.toList () ); }}

La oss nå utføre applikasjonen med mvn spring-boot: run og start en nettleser på // localhost: 8080 / hei for å sjekke resultatene.

3. Lage en krigsstøvel-krig

Servlet containere forventer at applikasjonene vil oppfylle noen kontrakter som skal distribueres. For Tomcat er kontrakten Servlet API 3.0.

For å få søknaden vår til å oppfylle denne kontrakten, må vi utføre noen små modifikasjoner i kildekoden.

Først må vi pakke en WAR-applikasjon i stedet for en JAR. For dette forandrer vi oss pom.xml med følgende innhold:

krig

La oss endre finalen KRIG filnavn for å unngå å inkludere versjonsnumre:

 $ {artifactId} ... 

Deretter skal vi legge til Tomcat-avhengighet:

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

Til slutt initialiserer vi Servlet-konteksten som kreves av Tomcat ved å implementere SpringBootServletInitializer grensesnitt:

@SpringBootApplication offentlig klasse SpringBootTomcatApplication utvider SpringBootServletInitializer {}

For å bygge vår Tomcat-distribuerbare WAR-applikasjon, kjører vi mvn ren pakke. Etter det blir WAR-filen vår generert kl target / spring-boot-tomcat.war (antar at Maven artefaktId er "spring-boot-tomcat").

Vi bør vurdere at dette nye oppsettet gjør vår Spring Boot-applikasjon til et ikke-frittstående program (hvis du vil at det skal fungere i frittstående modus igjen, fjern sørget for omfang fra tomcat-avhengighet).

4. Distribuere KRIGEN til Tomcat

For å få WAR-filen distribuert og kjøre i Tomcat, må vi fullføre følgende trinn:

  1. Last ned Apache Tomcat og pakk den ut til en tomcat mappe
  2. Kopier WAR-filen vår fra target / spring-boot-tomcat.war til tomcat / webapps / mappe
  3. Fra en terminal naviger til tomcat / søppel mappe og utføre
    1. catalina.bat run (på Windows)
    2. catalina.sh kjøre (på Unix-baserte systemer)
  4. Gå til // localhost: 8080 / spring-boot-tomcat / hallo

Dette har vært et raskt Tomcat-oppsett, vennligst sjekk guiden på Tomcat Installasjon for en komplett installasjonsveiledning. Det er også flere måter å distribuere en WAR-fil til Tomcat.

5. Konklusjon

I denne korte guiden opprettet vi et enkelt Spring Boot-program og gjorde det til et gyldig WAR-program som kan distribueres på en Tomcat-server.

Som alltid er hele kildekoden til eksemplene tilgjengelig på GitHub.