Spustenie aplikácie Spring Boot s programom Maven a spustiteľnou vojnou / jar

1. Úvod

V tomto výučbe preskúmame rozdiely medzi spustením webovej aplikácie Spring Boot prostredníctvom servera mvn spring-boot: spustiť príkaz a spustenie po kompilácii do balíka jar / war cez java -jar príkaz.

Predpokladajme, že tu už poznáte konfiguráciu Spring Boot prebaliť cieľ. Viac podrobností o tejto téme nájdete v článku Vytvorenie aplikácie Fat Jar s jarným spustením.

2. Doplnok Spring Boot Maven

Pri písaní aplikácie Spring Boot je odporúčaným nástrojom na zostavenie, testovanie a zabalenie nášho kódu doplnok Spring Boot Maven.

Tento doplnok sa dodáva s mnohými pohodlnými funkciami, ako napríklad:

  • rieši správne verzie závislostí pre nás
  • môže zbaliť všetky naše závislosti (vrátane v prípade potreby zabudovaného aplikačného servera) do jedného spustiteľného tuku / war a bude tiež:
    • spravovať za nás konfiguráciu cesty k triede, aby sme to mohli preskočiť -cp možnosť v našom java -jar príkaz
    • implementovať zvyk ClassLoader vyhľadať a načítať všetky externé knižnice jar, ktoré sú teraz vnorené do balíka
    • automaticky nájsť hlavný() metódu a nakonfigurovať ju v manifeste, takže nemusíme špecifikovať hlavnú triedu v našom java -jar príkaz

3. Spustenie kódu s Maven v rozloženej podobe

Keď pracujeme na webovej aplikácii, môžeme využiť ďalšiu veľmi zaujímavú vlastnosť Doplnok Spring Boot Maven: schopnosť automaticky nasadiť našu webovú aplikáciu na zabudovaný aplikačný server.

Potrebujeme iba jednu závislosť, aby sme doplnku oznámili, že chceme na spustenie nášho kódu použiť Tomcat:

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

Teraz, keď sa vykonáva mvn spring-boot: spustiť príkazom v našom koreňovom priečinku projektu, plugin prečíta konfiguráciu pom a pochopí, že vyžadujeme kontajner webových aplikácií.

Vykonávanie mvn spring-boot: spustiť príkaz spustí stiahnutie Apache Tomcat a inicializuje spustenie Tomcat.

Poďme to skúsiť:

$ mvn spring-boot: spustiť ... ... [INFO] ---------------------------------- ------ [INFO] Budovanie spring-boot-ops 0.0.1-SNAPSHOT [INFO] --------------------------- ----- [vojna] --------------------------------- [INFO] [INFO] >>> spring-boot-maven-plugin: 2.1.3.RELEASE: run (default-cli)> test-compile @ spring-boot-ops >>> Sťahovanie z central: //repo.maven.apache.org/maven2/org /apache/tomcat/embed/tomcat-embed-core/9.0.16/tomcat-embed-core-9.0.16.pom Stiahnuté z centra: //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- plugin: 2.1.3.RELEASE: run (default-cli) @ spring-boot-ops --- ... ... 11: 33: 36.648 [main] INFO oacatalina.core.StandardService - Spustenie služby [Tomcat] 11: 33: 36 649 [main] INFO oacatalina.core.StandardEngine - spúšťací servletový engine: [Apache Tomcat / 9.0.16] ... ... 11: 33: 36 952 [main] INFO oaccC [Tomcat]. [Localhost ]. [/] - Inicializácia jarnej em uložený WebApplicationContext ... ... 11: 33: 48.223 [hlavný] INFO oacoyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8080"] 11: 33: 48.289 [hlavný] INFO osbwetomcat.TomcatWebServer - Tomcat spustené na porte: 8080 (http) s kontextovou cestou '' 11: 33: 48.292 [hlavná] INFO org.baeldung.boot.Application - spustená aplikácia za 22 454 sekúnd (JVM beží 37 692)

Keď sa v denníku zobrazí riadok obsahujúci „Spustenú aplikáciu“, je naša webová aplikácia pripravená na dopyt prostredníctvom prehliadača na adrese // localhost: 8080 /

4. Spustenie kódu ako samostatnej aplikácie

Len čo prejdeme vývojovou fázou a chceme pokročiť v zavádzaní našej aplikácie do výroby, musíme našu aplikáciu zbaliť.

Bohužiaľ, ak pracujeme s jar balíček, základný Maven balíček cieľ nezahŕňa žiadnu z externých závislostí.

To znamená, že ho môžeme použiť iba ako knižnicu vo väčšom projekte.

Aby ste obišli toto obmedzenie,musíme využiť plugin Maven Spring Boot prebaliť cieľom je spustiť našu jar / war ako samostatnú aplikáciu.

4.1. Konfigurácia

Zvyčajne potrebujeme nakonfigurovať iba doplnok na zostavenie:

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

Náš ukážkový projekt ale obsahuje viac ako jednu hlavnú triedu, takže musíme Jave povedať, ktorá trieda sa má spustiť, a to buď nakonfigurovaním doplnku:

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

alebo nastavením štart-trieda nehnuteľnosť:

 com.baeldung.webjar.WebjarsdemoApplication 

4.2. Spustenie aplikácie

Teraz môžeme náš príklad vojny spustiť pomocou dvoch jednoduchých príkazov:

$ mvn čistý balíček spring-boot: prebalenie $ java -jar target / spring-boot-ops.war

Viac podrobností o tom, ako spustiť súbor jar, nájdete v našom článku Spustenie aplikácie JAR pomocou argumentov príkazového riadku.

4.3. Vo vojnovom súbore

Aby sme lepšie pochopili, ako môže príkaz uvedený vyššie spustiť úplnú serverovú aplikáciu, môžeme sa pozrieť na našu jar-boot-ops.war.

Ak to dekomprimujeme a nakukneme dovnútra, nájdeme obvyklých podozrivých:

  • META-INF, s automaticky generovaným MANIFEST.MF
  • WEB-INF / triedy, ktorý obsahuje naše zostavené triedy
  • WEB-INF / lib, ktorá obsahuje naše vojnové závislosti a vložené súbory jar Tomcat

To však nie je všetko, pretože existujú niektoré priečinky špecifické pre našu konfiguráciu balíkov s obsahom tuku:

  • WEB-INF / poskytované za lib, ktoré obsahujú externé knižnice požadované pri spustení vloženého, ​​ale nie pri nasadení
  • org / springframework / boot / loader, ktorý obsahuje načítavač vlastných tried Spring Boot - táto knižnica je zodpovedná za načítanie našich externých závislostí a ich sprístupnenie za behu

4.4. Vo vojnovom manifeste

Ako už bolo spomenuté, zásuvný modul Maven Spring Boot nájde hlavnú triedu a vygeneruje konfiguráciu potrebnú na spustenie java príkaz.

Výsledný MANIFEST.MF má niekoľko ďalších riadkov:

Hlavná trieda: com.baeldung.webjar.WebjarsdemoApplication Hlavná trieda: org.springframework.boot.loader.WarLauncher

Obzvlášť môžeme pozorovať, že posledný špecifikuje spúšťač triedy Spring Boot, ktorý sa má použiť.

4.5. Vo vnútri spisu

Vzhľadom na predvolenú stratégiu balenia, naša vojnové balenie scenár sa príliš nelíši, či už použijeme Doplnok Spring Boot Maven alebo nie.

Aby sme lepšie ocenili výhody pluginu, môžeme skúsiť zmeniť pom balenie konfigurácia do jar a bežať mvn čistý balíček ešte raz.

Teraz môžeme pozorovať, že naša nádoba na tuky je usporiadaná trochu inak ako náš predchádzajúci vojnový súbor:

  • Všetky naše priečinky pre triedy a zdroje sa teraz nachádzajú pod BOOT-INF / triedy
  • BOOT-INF / lib obsahuje všetky externé knižnice

Bez doplnku lib priečinok by neexistoval a celý obsah priečinka BOOT-INF / triedy bude umiestnený v koreňovom adresári balíka.

4.6. Vo vnútri manifestu pohárov

Tiež MANIFEST.MF sa zmenil a obsahuje tieto ďalšie riadky:

Triedy Spring-Boot: BOOT-INF / classes / Spring-Boot-Lib: BOOT-INF / lib / Spring-Boot-Version: 2.1.3.RELEASE Hlavná trieda: org.springframework.boot.loader.JarLauncher

Triedy jarných topánok a Spring-Boot-Lib sú obzvlášť zaujímavé, pretože nám hovoria, kde zavádzač tried nájde triedy a externé knižnice.

5. Ako si vybrať

Pri analýze nástrojov je nevyhnutné brať do úvahy účel, pre ktorý sú tieto nástroje vytvorené. Chceme uľahčiť vývoj alebo zabezpečiť plynulé nasadenie a prenosnosť? Pozrime sa na fázy, ktoré táto voľba najviac ovplyvňuje.

5.1. Rozvoj

Ako vývojári často trávime väčšinu času programovaním bez toho, aby sme museli tráviť veľa času nastavením nášho prostredia na miestne spustenie kódu. V jednoduchých aplikáciách to zvyčajne nie je problém. Pre zložitejšie projekty však možno budeme musieť nastaviť premenné prostredia, spustiť servery a naplniť databázy.

Konfigurácia správneho prostredia zakaždým, keď chceme aplikáciu spustiť, by bola veľmi nepraktická, najmä ak musí bežať súčasne viac služieb.

To je miesto, kde nám pomáha spustenie kódu pomocou Mavenu. Celú základňu kódov už máme lokálne odhlásenú, takže môžeme využiť konfiguráciu pom a súbory zdrojov. Môžeme nastaviť premenné prostredia, vložiť databázu v pamäti a dokonca stiahnuť správnu verziu servera a nasadiť našu aplikáciu pomocou jedného príkazu.

Aj vo viacmodulovej kódovej základni, kde každý modul vyžaduje rôzne premenné a verzie servera, môžeme ľahko spustiť správne prostredie prostredníctvom profilov Maven.

5.2. Výroba

Čím viac sa posúvame k výrobe, tým viac sa konverzácia posúva k stabilite a bezpečnosti. Preto nemôžeme použiť proces použitý v našom vývojovom stroji na server so živými zákazníkmi.

Spustenie kódu cez Maven v tejto fáze je zlý postup z viacerých dôvodov:

  • Najskôr by sme potrebovali nainštalovať Maven
  • Potom už len preto, že potrebujeme kompilovať kód, potrebujeme úplnú sadu Java Development Kit (JDK)
  • Ďalej musíme skopírovať databázu kódov na náš server a ponechať všetok náš vlastný kód v čistom texte
  • The mvn príkaz musí vykonať všetky fázy životného cyklu (nájsť zdroje, zostaviť a spustiť)
  • Vďaka predchádzajúcemu bodu by sme tiež minuli CPU a v prípade cloudového servera peniaze
  • Maven založí viac procesov Java, každý s pamäťou (štandardne každý z nich používa rovnaké množstvo pamäte ako nadradený proces)
  • Nakoniec, ak máme na nasadenie viac serverov, vyššie uvedené sa opakuje na každom z nich

Je to len niekoľko dôvodov odoslanie aplikácie ako balíka je pre výrobu praktickejšie.

6. Záver

V tomto tutoriáli sme preskúmali rozdiely medzi spustením nášho kódu cez Maven a cez java -jar príkaz. Spustili sme tiež rýchly prehľad niektorých scenárov praktických prípadov.

Zdrojový kód použitý v tomto článku je k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found