Tenké JARy s jarnou topánkou

1. Úvod

V tomto návode sa pozrieme na Ako zostaviť projekt Spring Boot do tenkého súboru JAR pomocou súboru jar-boot-tenky-launcher projekt.

Spring Boot je známy svojimi „tučnými“ nasadeniami JAR, kde jeden spustiteľný artefakt obsahuje kód aplikácie aj všetky jeho závislosti.

Boot sa tiež široko používa na vývoj mikroslužieb. To môže byť niekedy v rozpore s prístupom „fat JAR“, pretože zahrnutie rovnakých závislostí do mnohých artefaktov sa môže stať dôležitým plytvaním zdrojmi.

2. Predpoklady

V prvom rade samozrejme potrebujeme projekt Spring Boot. V tomto článku sa pozrieme na zostavy Maven a zostavy Gradle v ich najbežnejších konfiguráciách.

Nie je možné pokryť všetky zostavovacie systémy a konfigurácie zostavenia, ale dúfajme, že si pozrieme dosť všeobecných princípov, ktoré by ste mali vedieť aplikovať na svoje konkrétne nastavenie.

2.1. Maven Projects

V bootovacom projekte vytvorenom pomocou Mavenu by sme mali mať v našom projekte nakonfigurovaný doplnok Spring Boot Maven pom.xml jeho rodič alebo jeden z jeho predkov:

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

O verzii závislostí Spring Boot sa zvyčajne rozhoduje pomocou kusovníka alebo dedením z nadradeného POM, ako v našom referenčnom projekte:

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

2.2. Projekty Gradle

V bootovacom projekte vytvorenom pomocou Gradle budeme mať doplnok Boot Gradle:

buildscript {ext {springBootPlugin = 'org.springframework.boot: spring-boot-gradle-plugin' springBootVersion = '2.2.2.RELEASE'} úložiská {mavenCentral ()} závislosti {classpath ("$ {springBootPlugin}: $ {springBootVersion } ")}} // elided apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management' springBoot {mainClassName = 'com.baeldung.DemoApplication'}

Upozorňujeme, že v tomto článku budeme uvažovať iba o Boot 2.x a novších projektoch. Thin Launcher podporuje aj staršie verzie, vyžaduje však trochu inú konfiguráciu Gradle, ktorú pre jednoduchosť vynechávame. Viac podrobností nájdete na domovskej stránke projektu.

3. Ako vytvoriť tenký JAR?

Spring Boot Thin Launcher je malá knižnica, ktorá načíta závislosti artefaktu zo súboru zabaleného v samotnom archíve, stiahne ich z úložiska Maven a nakoniec spustí hlavnú triedu aplikácie.

Takže keď zostavujeme projekt s knižnicou, dostaneme súbor JAR s našim kódom, súbor s vymenovaním jeho závislostí a hlavnú triedu z knižnice, ktorá vykonáva vyššie uvedené úlohy.

Samozrejme, veci sú o niečo jemnejšie ako naše zjednodušené vysvetlenie; o niektorých témach sa budeme podrobnejšie rozprávať ďalej v článku.

4. Základné použitie

Pozrime sa teraz, ako vytvoriť „tenký“ JAR z našej bežnej aplikácie Spring Boot.

Aplikáciu spustíme obvyklým spôsobom java -jar, s voliteľnými ďalšími argumentmi príkazového riadku, ktoré ovládajú tenký spúšťač. Pár ich uvidíme v nasledujúcich častiach; domovská stránka projektu obsahuje celý zoznam.

4.1. Maven Projects

V projekte Maven musíme upraviť deklaráciu Boot pluginu (pozri časť 2.1) tak, aby obsahovala závislosť na vlastnom „tenkom“ rozložení:

 org.springframework.boot spring-boot-maven-plugin org.springframework.boot.experimentálne spring-boot-thin-layout 1.0.11.RELEASE 

Spúšťač bude čítať závislosti z pom.xml súbor, ktorý Maven ukladá do vygenerovaného JAR v META-INF / maven adresár.

Zostavenie uskutočníme ako obvykle, napr. S inštalácia mvn.

Ak chceme byť schopní vytvárať tenké aj tučné zostavy (napríklad v projekte s viacerými modulmi), môžeme deklarovať vlastné rozloženie vo vyhradenom profile Maven.

4.2. Maven a závislosti: tenké.vlastnosti

Môžeme tiež nechať Maven vygenerovať a tenké.vlastnosti súbor okrem pom.xml. V takom prípade bude súbor obsahovať úplný zoznam závislostí vrátane prechodných a spúšťač ho bude uprednostňovať pred pom.xml.

Mojo (doplnok) na to je spring-boot-thin-maven-plugin: vlastnosti, a štandardne vydáva tenké.vlastnosti uložiť v src / main / resources / META-INF, ale môžeme určiť jeho umiestnenie pomocou tenký.výstup nehnuteľnosť:

$ mvn org.springframework.boot.experimental: spring-boot-thin-maven-plugin: properties -Dthin.output =.

Upozorňujeme, že aby bol cieľ úspešný, musí existovať výstupný adresár, aj keď sme zachovali predvolený.

4.3. Projekty Gradle

V projekte Gradle namiesto toho pridáme vyhradený doplnok:

buildscript {ext {// ... thinPlugin = 'org.springframework.boot.experimental: spring-boot-thin-gradle-plugin' thinVersion = '1.0.11.RELEASE'} // ... závislosti {//. .. classpath ("$ {thinPlugin}: $ {thinVersion}")}} // elided apply plugin: 'maven' apply plugin: 'org.springframework.boot.experimental.thin-launcher'

Na získanie tenkej zostavy povieme Gradle, aby vykonalo thinJar úloha:

~ / projects / baeldung / spring-boot-gradle $ ./gradlew thinJar

4.4. Gradle a závislosti: pom.xml

V príklade kódu v predchádzajúcej časti sme okrem Thin Launcheru deklarovali aj doplnok Maven (rovnako ako doplnky Boot and Dependency Management, ktoré sme už videli v sekcii Požiadavky).

Je to preto, že rovnako ako v prípade Maven, ktorý sme videli už skôr, bude artefakt obsahovať a bude používať znak pom.xml súbor s vymenovaním závislostí aplikácie. The pom.xml súbor je generovaný úlohou nazvanou thinPom, čo je implicitná závislosť akejkoľvek úlohy typu jar.

Vygenerované môžeme prispôsobiť pom.xml súbor s vyhradenou úlohou. Tu iba replikujeme, čo tenký doplnok už robí automaticky:

task createPom {def basePath = 'build / resources / main / META-INF / maven' doLast {pom {withXml (dependencyManagement.pomConfigurer)} .writeTo ("$ {basePath} / $ {project.group} / $ {project. meno} /pom.xml ")}}

Aby sme použili náš zvyk pom.xml súboru, pridáme vyššie uvedenú úlohu k závislostiam úlohy jar:

bootJar.dependsOn = [createPom]

4.5. Gradle a závislosti: tenké.vlastnosti

Môžeme tiež nechať Gradle vygenerovať a tenké.vlastnosti súbor radšej ako pom.xml, ako sme to robili predtým s Mavenom.

Úloha, ktorá generuje tenké.vlastnosti súbor sa volá thinProperties, a predvolene sa nepoužíva. Môžeme to pridať ako závislosť úlohy jar:

bootJar.dependsOn = [thinProperties]

5. Ukladanie závislostí

Zmyslom tenkých nádob je zabrániť spojeniu závislostí s aplikáciou. Závislosti však magicky nezmiznú, sú jednoducho uložené inde.

Thin Launcher využíva na riešenie závislostí najmä infraštruktúru Maven, takže:

  1. skontroluje miestne úložisko Maven, ktoré štandardne leží v ~ / .m2 / úložisko ale dá sa presunúť inam;
  2. potom stiahne chýbajúce závislosti z Maven Central (alebo z iného nakonfigurovaného úložiska);
  3. nakoniec ich uloží do miestneho úložiska, aby ich pri ďalšom spustení aplikácie už nebolo potrebné znova sťahovať.

Samozrejme, fáza sťahovania je pomalá a na chyby náchylná časť procesu, pretože to vyžaduje prístup k Maven Central cez internet alebo prístup k miestnemu proxy serveru a všetci vieme, ako sú tieto veci všeobecne nespoľahlivé.

Našťastie existujú rôzne spôsoby nasadenia závislostí spolu s aplikáciami, napríklad v vopred zabalenom kontajneri na nasadenie v cloude.

5.1. Spustenie aplikácie na zahriatie

Najjednoduchší spôsob medzipamäte závislostí je vykonať zahrievací chod aplikácie v cieľovom prostredí. Ako sme už videli skôr, spôsobí to stiahnutie závislostí a ich uloženie do medzipamäte v miestnom úložisku Maven. Ak spustíme viac ako jednu aplikáciu, úložisko bude obsahovať všetky závislosti bez duplikátov.

Pretože spustenie aplikácie môže mať nežiaduce vedľajšie účinky, môžeme tiež vykonať „beh nasucho“, ktorý vyrieši a stiahne závislosti iba bez spustenia kódu používateľa:

$ java -Dthin.dryrun = true -jar moja-app-1.0.jar

Upozorňujeme, že podľa konvencií Spring Boot môžeme nastaviť -Dthin.dryrun majetok aj s a –Tenke.dryrun argument príkazového riadku do aplikácie alebo pomocou a THIN_DRYRUN systémový majetok. Akákoľvek hodnota okrem nepravdivé dá pokyn tenkému spúšťaču, aby vykonal suchý chod.

5.2. Balenie závislostí počas zostavovania

Ďalšou možnosťou je zhromaždiť závislosti počas zostavovania bez ich zoskupovania do súboru JAR. Potom ich môžeme v rámci postupu nasadenia skopírovať do cieľového prostredia.

To je všeobecne jednoduchšie, pretože nie je potrebné spúšťať aplikáciu v cieľovom prostredí. Ak však nasadzujeme viac aplikácií, budeme musieť spojiť ich závislosti, a to buď manuálne, alebo pomocou skriptu.

Formát, v ktorom Thin Plugin pre Maven a Gradle balí závislosti počas zostavovania, je rovnaký ako lokálne úložisko Maven:

root / úložisko / com / net / org / ...

V skutočnosti môžeme aplikáciu nasmerovanú pomocou nástroja Thin Launcher nasmerovať do ľubovoľného takého adresára (vrátane lokálneho úložiska Maven) za behu aplikácie tenký.koren nehnuteľnosť:

$ java -jar moja-app-1.0.jar --thin.root = moja aplikácia / kroky

Môžeme tiež bezpečne zlúčiť viac takýchto adresárov tak, že ich skopírujeme jeden do druhého, čím získame úložisko Maven so všetkými potrebnými závislosťami.

5.3. Balenie závislostí pomocou Maven

Aby sme mohli zabezpečiť, aby Maven balíčky závislostí pre nás používal, vyriešiť cieľ spring-boot-thin-maven-plugin. Môžeme to vyvolať manuálne alebo automaticky v našom pom.xml:

 org.springframework.boot.experimentálny doplnok spring-boot-thin-maven-plugin $ {thin.version} vyriešiť vyriešiť false 

Po zostavení projektu nájdeme adresár cieľ / tenký / root / so štruktúrou, o ktorej sme hovorili v predchádzajúcej časti.

5.4. Balenie závislostí pomocou Gradle

Ak používame Gradle s tenký launcher namiesto toho máme doplnok thinResolve dostupná úloha. Úloha uloží aplikáciu a jej závislosti do súboru build / thin / root / adresár, podobne ako doplnok Maven v predchádzajúcej časti:

$ gradlew thinResolve

Upozorňujeme, že v čase písania tohto článku tenký launcher plugin obsahuje chybu, ktorá zabraňuje uloženiu závislostí, ak tenké.vlastnosti sa používa: //github.com/dsyer/spring-boot-thin-launcher/issues/53.

6. Závery a ďalšie čítanie

V tomto článku sme sa zaoberali výrobou našej tenkej nádoby. Tiež sme videli, ako používať infraštruktúru Maven na sťahovanie a ukladanie ich závislostí.

Domovská stránka tenkého spúšťača obsahuje niekoľko ďalších návodov HOW-TO pre scenáre, ako je napríklad nasadenie cloudu do Heroku, ako aj úplný zoznam podporovaných argumentov príkazového riadku.

Implementáciu všetkých príkladov a úryvkov kódu Maven nájdete v projekte GitHub - ako projekt Maven, takže by malo byť ľahké importovať a bežať tak, ako sú.

Podobne všetky príklady Gradle odkazujú na tento projekt GitHub.


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