Pokretanje aplikacije Spring Boot s Mavenom protiv izvršnog rata / jar-a

1. Uvod

U ovom uputstvu istražit ćemo razlike između pokretanja web aplikacije Spring Boot putem mvn spring-boot: trčanje naredbu i pokretanje nakon što se prevede u jar / war paket putem java -jar naredba.

Pretpostavimo da ste ovdje već upoznati s konfiguracijom Spring Boot-a prepakiranje cilj. Za više detalja o ovoj temi pročitajte Stvaranje aplikacije za masne tegle s proljetnim čizmama.

2. Dodatak Spring Boot Maven

Prilikom pisanja aplikacije Spring Boot, dodatak Spring Boot Maven preporučeni je alat za izgradnju, testiranje i pakiranje našeg koda.

Ovaj dodatak isporučuje se s puno prikladnih značajki, kao što su:

  • rješava ispravne verzije ovisnosti za nas
  • može spakirati sve naše ovisnosti (uključujući ugrađeni poslužitelj aplikacija, ako je potrebno) u jednu, spremnu masti / rata za pokretanje, a također će:
    • upravljajte nam konfiguracijom putova predavanja, tako da možemo preskočiti toliko dugo -cp opcija u našem java -jar naredba
    • provesti običaj ClassLoader za pronalaženje i učitavanje svih vanjskih knjižnica jar, koje su sada ugniježđene unutar paketa
    • automatski pronađi glavni() metodu i konfigurirajte je u manifestu, tako da ne moramo navesti glavnu klasu u našoj java -jar naredba

3. Pokretanje koda s Mavenom u eksplodiranom obliku

Kada radimo na web aplikaciji, možemo iskoristiti još jednu vrlo zanimljivu značajku Dodatak Spring Boot Maven: mogućnost automatske implementacije naše web aplikacije na ugrađeni poslužitelj aplikacija.

Treba nam samo jedna ovisnost kako bismo dodatak znali da želimo koristiti Tomcat za pokretanje našeg koda:

 org.springframework.boot spring-boot-starter-web 

Sada, prilikom izvršavanja mvn spring-boot: trčanje naredbu u našoj korijenskoj mapi projekta, dodatak čita pom konfiguraciju i razumije da nam je potreban spremnik web aplikacije.

Izvršenje mvn spring-boot: trčanje naredba pokreće preuzimanje Apache Tomcat i inicijalizira pokretanje Tomcata.

Pokušajmo:

$ mvn spring-boot: run ... ... [INFO] ---------------------------------- ------ [INFO] Izgradnja opruga-boot-ops 0.0.1-SNAPSHOT [INFO] --------------------------- ----- [rat] --------------------------------- [INFO] [INFO] >>> spring-boot-maven-plugin: 2.1.3.OSPUSTI: pokrenite (zadani-cli)> test-compile @ spring-boot-ops >>> Preuzimanje s centrale: //repo.maven.apache.org/maven2/org /apache/tomcat/embed/tomcat-embed-core/9.0.16/tomcat-embed-core-9.0.16.pom Preuzeto sa centralne stranice: //repo.maven.apache.org/maven2/org/apache/tomcat/ embed / tomcat-embed-core / 9.0.16 / tomcat-embed-core-9.0.16.pom (1,8 kB pri 2,8 kB / s) ... ... [INFO] --- spring-boot-maven- dodatak: 2.1.3.RELEASE: run (default-cli) @ spring-boot-ops --- ... ... 11: 33: 36.648 [main] INFO oacatalina.core.StandardService - Pokretanje usluge [Tomcat] 11: 33: 36.649 [glavna] INFO oacatalina.core.StandardEngine - Pokretanje servlet motora: [Apache Tomcat / 9.0.16] ... ... 11: 33: 36.952 [glavna] INFO oaccC [Tomcat]. [Localhost ]. [/] - Inicijalizacija proljeća em krevetni WebApplicationContext ... ... 11: 33: 48.223 [glavna] INFO oacoyote.http11.Http11NioProtocol - Pokretanje ProtocolHandler ["http-nio-8080"] 11: 33: 48.289 [glavna] INFO osbwetomcat.TomcatWebServer - Tomcat pokrenuto na priključcima: 8080 (http) s putom konteksta '' 11: 33: 48.292 [glavna] INFO org.baeldung.boot.Aplikacija - pokrenuta aplikacija za 22.454 sekunde (JVM radi za 37.692)

Kada se u zapisniku prikaže redak koji sadrži ‘Započeta aplikacija’, naša je web aplikacija spremna za upit putem preglednika na adresi // localhost: 8080 /

4. Pokretanje koda kao samostalne paketne aplikacije

Jednom kada prođemo kroz razvojnu fazu i želimo napredovati prema približavanju naše aplikacije proizvodnji, svoju aplikaciju moramo spakirati.

Nažalost, ako radimo s a staklenka paket, osnovni Maven paket Cilj ne uključuje niti jednu vanjsku ovisnost.

To znači da ga možemo koristiti samo kao knjižnicu u većem projektu.

Da biste zaobišli ovo ograničenje,moramo iskoristiti dodatak Maven Spring Boot prepakiranje cilj nam je pokrenuti jar / rat kao samostalnu aplikaciju.

4.1. Konfiguracija

Obično trebamo konfigurirati dodatak za izgradnju:

  ... org.springframework.boot spring-boot-maven-plugin ... 

Ali naš primjer projekta sadrži više od jedne glavne klase, tako da Java moramo reći koju će klasu pokrenuti, bilo konfiguriranjem dodatka:

 org.springframework.boot spring-boot-maven-plugin com.baeldung.webjar.WebjarsdemoApplication 

ili postavljanjem početna klasa svojstvo:

 com.baeldung.webjar.WebjarsdemoApplication 

4.2. Pokretanje aplikacije

Sada možemo pokrenuti naš primjer rata s dvije jednostavne naredbe:

$ mvn čist paket spring-boot: prepakirajte $ java -jar target / spring-boot-ops.war

Više detalja o pokretanju jar datoteke možete pronaći u našem članku Pokretanje JAR aplikacije s argumentima naredbenog retka.

4.3. Unutar ratne datoteke

Da bismo bolje razumjeli kako gore navedena naredba može pokrenuti cjelovitu poslužiteljsku aplikaciju, možemo pogledati našu spring-boot-ops.rat.

Ako ga komprimiramo i zavirimo unutra, pronalazimo uobičajene sumnjivce:

  • META-INF, s automatski generiranim NAJVIŠE.MF
  • WEB-INF / satovi, koji sadrži naše kompilirane klase
  • WEB-INF / lib, koji sadrži naše ratne ovisnosti i ugrađene datoteke Tomcat jar

To ipak nije sve, jer postoje neke mape specifične za našu konfiguraciju masnog paketa:

  • WEB-INF / lib, koji sadrži vanjske knjižnice potrebne za pokretanje ugrađenih, ali ne i za postavljanje
  • org / springframework / boot / loader, u kojem se nalazi učitač prilagođenih klasa Spring Boot - ova je knjižnica odgovorna za učitavanje naših vanjskih ovisnosti i čini ih dostupnima u vrijeme izvođenja

4.4. Unutar Ratnog manifesta

Kao što je već spomenuto, dodatak Maven Spring Boot pronalazi glavnu klasu i generira konfiguraciju potrebnu za pokretanje Java naredba.

Dobivena NAJVIŠE.MF ima nekoliko dodatnih redaka:

Početna klasa: com.baeldung.webjar.WebjarsdemoApplication Glavna klasa: org.springframework.boot.loader.WarLauncher

Konkretno, možemo primijetiti da posljednji određuje pokretački program loader klase Spring Boot koji će se koristiti.

4.5. Unutar datoteke Jar

Zbog zadane strategije pakiranja, naša ratna ambalaža scenarij se ne razlikuje puno, koristimo li Dodatak Spring Boot Maven ili ne.

Da bismo bolje uvidjeli prednosti dodatka, možemo pokušati promijeniti pom ambalaža konfiguracija na staklenka i trči mvn čist paket opet.

Sada možemo primijetiti da je naša masna tegla organizirana malo drugačije od naše prethodne ratne datoteke:

  • Sve naše mape klasa i resursa sada se nalaze pod BOOT-INF / satovi
  • ČIZME-INF / lib čuva sve vanjske knjižnice

Bez dodatka, lib mapa ne bi postojala i sav sadržaj datoteke BOOT-INF / satovi nalazio bi se u korijenu paketa.

4.6. Unutar manifesta Jar

Također NAJVIŠE.MF se promijenio, uključujući sljedeće dodatne linije:

Spring-Boot-Class: BOOT-INF / classes / Spring-Boot-Lib: BOOT-INF / lib / Spring-Boot-Version: 2.1.3.RELEASE Main-Class: org.springframework.boot.loader.JarLauncher

Proljetni tečajevi za dizanje i Spring-Boot-Lib su posebno zanimljivi jer nam govore gdje će učitelj klasa pronaći predmete i vanjske knjižnice.

5. Kako odabrati

Pri analiziranju alata, nužno je uzeti u obzir svrhu za koju su ovi alati stvoreni. Želimo li olakšati razvoj ili osigurati nesmetanu implementaciju i prenosivost? Pogledajmo faze na koje je ovaj izbor najviše utjecao.

5.1. Razvoj

Kao programeri, često provodimo većinu svog vremena kodirajući, a da ne trošimo puno vremena postavljajući svoje okruženje za lokalno pokretanje koda. U jednostavnim aplikacijama to obično nije problem. No, za složenije projekte možda ćemo morati postaviti varijable okruženja, pokrenuti poslužitelje i popuniti baze podataka.

Konfiguriranje pravog okruženja svaki put kad želimo pokrenuti aplikaciju bilo bi vrlo nepraktično, pogotovo ako istovremeno mora raditi više od jedne usluge.

Tu nam pomaže pokretanje koda s Mavenom. Već imamo lokalnu provjeru cijele baze kodova, tako da možemo iskoristiti pom konfiguraciju i datoteke resursa. Možemo postaviti varijable okruženja, stvoriti bazu podataka u memoriji, pa čak i preuzeti ispravnu verziju poslužitelja i jednom naredbom implementirati našu aplikaciju.

Čak i u višemodulnoj bazi kodova, gdje svaki modul treba različite varijable i verzije poslužitelja, lako možemo pokrenuti pravo okruženje putem Maven profila.

5.2. Proizvodnja

Što se više krećemo prema proizvodnji, to se više razgovor prebacuje prema stabilnosti i sigurnosti. Zbog toga postupak koji se koristi za naš razvojni stroj ne možemo primijeniti na poslužitelj s aktivnim kupcima.

Pokretanje koda kroz Maven u ovoj je fazi loša praksa iz više razloga:

  • Prije svega, trebali bismo instalirati Maven
  • Zatim, samo zato što moramo kompajlirati kod, trebamo puni Java Development Kit (JDK)
  • Dalje, bazu kodova moramo kopirati na naš poslužitelj, ostavljajući sav svoj vlasnički kôd u običnom tekstu
  • The mvn naredba mora izvršiti sve faze životnog ciklusa (pronaći izvore, sastaviti i pokrenuti)
  • Zahvaljujući prethodnoj točki, potrošili bismo i CPU, a u slučaju poslužitelja u oblaku i novac
  • Maven mrijesti više Java procesa, svaki koji koristi memoriju (prema zadanim postavkama, oni koriste istu količinu memorije kao nadređeni proces)
  • Napokon, ako imamo više poslužitelja za postavljanje, sve gore navedeno se ponavlja na svakom od njih

Ovo je samo nekoliko razloga zašto isporuka aplikacije u paketu je praktičnija za proizvodnju.

6. Zaključak

U ovom uputstvu istražili smo razlike između izvođenja našeg koda putem Mavena i putem java -jar naredba. Izveli smo i brzi pregled nekih praktičnih scenarija slučajeva.

Izvorni kod korišten u ovom članku dostupan je na GitHubu.