Nu construiți borcane grase pentru aplicațiile Docker de Jan Weinschenker Holisticon Consultants Medium

Când construiți aplicații Java cu Maven, cum ar fi aplicațiile Spring Boot sau Vert.x, o modalitate populară de a merge este să grupați codul aplicației și toate borcanele sale de dependență într-un singur vas de grăsime. De obicei, pluginul Maven Shade este utilizat în acest scop.

grase

Dar este într-adevăr o idee bună? Când creați un mic serviciu, codul aplicației dvs. va fi compilat în câteva sute de kiloocteți sau câțiva megaocteți de fișiere de clasă. Numai acest lucru va duce la un fișier jar destul de mic.

Dar așteptați până când pluginul de umbră s-a terminat. Acesta va adăuga fișierele de clasă ale tuturor dependențelor dvs. la acest fișier jar. Dintr-o dată, fișierul dvs. de aplicație poate crește cu ușurință la o dimensiune de câteva sute de megaocteți.

Așa cum a menționat Jonathan Haber în marele său articol în urmă cu câțiva ani, s-ar putea argumenta că borcanele nu au fost niciodată menite să fie folosite astfel. În plus, este predispus la erori să agregăm o mulțime de borcane într-un singur fișier.

S-ar putea să existe clase cu același nume și pachet printre dependențele dvs. Care va ajunge în borcanul tău gras?

În opinia mea, problema mai mare este ineficiența. Dacă publicați borcanul de grăsime într-un depozit de artefacte, dependențele incluse vor ocupa spațiu de stocare ca artefacte individuale, în timp ce vor fi stocate și ca parte a borcanului de grăsimi. Nu are prea mult sens dacă mă întrebi.

Construirea unui borcan de grăsime consumă mult timp. Combinarea conținutului tuturor borcanelor de dependență tot timpul în timp ce se ocupă de fișiere de clasă duplicate face ca versiunea dvs. să dureze mai mult decât este necesar. Aceasta este o cantitate considerabilă de I/O de fișiere pe care infrastructura dvs. CI trebuie să o gestioneze în mod regulat, adică pe fiecare construcție.

Rularea unui borcan de grăsime ca aplicație Java este destul de simplă:

Deoarece borcanul de grăsime este autonom, acesta este tot ce aveți nevoie.

Rularea unui fișier jar care necesită borcane suplimentare este mai complicată. Nu puteți specifica -jar împreună cu -cp. Acest lucru nu va funcționa: