Formatul de borcan executabil

Modulele Spring-Boot-Loader permit Spring Boot să accepte fișiere jar și război executabile. Dacă utilizați pluginul Maven sau pluginul Gradle, borcanele executabile sunt generate automat și, în general, nu trebuie să cunoașteți detaliile despre modul în care funcționează.

executabil

Dacă aveți nevoie să creați borcane executabile dintr-un alt sistem de construire sau dacă sunteți doar curioși cu privire la tehnologia de bază, această anexă oferă câteva informații.

1. JAR-uri imbricate

Java nu oferă nicio modalitate standard de încărcare a fișierelor jar imbricate (adică fișiere jar care sunt ele însele conținute într-un jar). Acest lucru poate fi problematic dacă trebuie să distribuiți o aplicație autonomă care poate fi rulată din linia de comandă fără despachetare.

Pentru a rezolva această problemă, mulți dezvoltatori folosesc borcane „umbrite”. Un borcan umbrit împachetează toate clasele, din toate borcanele, într-un singur „borcan uber”. Problema cu borcanele umbrite este că devine greu să vezi ce biblioteci sunt de fapt în aplicația ta. Poate fi, de asemenea, problematic dacă același nume de fișier este utilizat (dar cu conținut diferit) în mai multe borcane. Spring Boot adoptă o abordare diferită și vă permite să faceți cuiburi direct.

1.1. Structura fișierului Jar executabil

Fișierele jar compatibile cu Spring Boot Loader ar trebui să fie structurate în felul următor:

Clasele de aplicații trebuie plasate într-un director imbricat BOOT-INF/classes. Dependențele ar trebui plasate într-un director imbricat BOOT-INF/lib.

1.2. Structura fișierului de război executabil

Fișierele de război compatibile cu Spring Boot Loader ar trebui să fie structurate în felul următor:

Dependențele ar trebui plasate într-un director WEB-INF/lib imbricat. Orice dependență care este necesară atunci când rulează încorporat, dar care nu este necesară la implementarea într-un container web tradițional, trebuie plasată în WEB-INF/lib-provided .

1.3. Fișiere index

Arhivele jar și război compatibile cu Spring Boot Loader pot include fișiere index suplimentare în directorul BOOT-INF /. Un fișier classpath.idx poate fi furnizat atât pentru borcane, cât și pentru războaie, oferă ordinea ca borcanele să fie adăugate la clasa de cale. Fișierul layer.idx poate fi utilizat numai pentru borcane, permite împărțirea unui borcan în straturi logice pentru crearea imaginii Docker/OCI.

Fișierele index urmează o sintaxă compatibilă cu YAML, astfel încât să poată fi analizate cu ușurință de instrumente terțe. Cu toate acestea, aceste fișiere nu sunt analizate intern ca YAML și trebuie să fie scrise exact în formatele descrise mai jos pentru a putea fi utilizate.

1.4. Classpath Index

Fișierul index classpath poate fi furnizat în BOOT-INF/classpath.idx. Oferă o listă a numelor de jar (fără a include directorul) în ordinea în care acestea trebuie adăugate la classpath. Fiecare linie trebuie să înceapă cu spațiul de liniuță ("- ·"), iar numele trebuie să fie între ghilimele duble.

De exemplu, având în vedere următorul borcan:

Fișierul index ar arăta astfel:

1.5. Indexul stratului

Fișierul index de straturi poate fi furnizat în BOOT-INF/layer.idx. Oferă o listă de straturi și părțile borcanului care ar trebui să fie conținute în ele. Straturile sunt scrise în ordinea în care trebuie adăugate la imaginea Docker/OCI. Numele straturilor sunt scrise ca șiruri citate prefixate cu liniuță ("- ·") și cu un sufix punct (":"). Conținutul stratului este fie un nume de fișier, fie un director scris ca un șir citat prefixat de spațiu spațiu liniuță ("·· - ·"). Un nume de director se termină cu /, un nume de fișier nu. Când se utilizează un nume de director înseamnă că toate fișierele din acel director se află în același strat.

Un exemplu tipic de index de straturi ar fi:

2. Clasa „JarFile” a Spring Boot

Clasa de bază utilizată pentru a suporta încărcarea borcanelor imbricate este org.springframework.boot.loader.jar.JarFile. Vă permite să încărcați conținutul jar dintr-un fișier jar standard sau din date cu borcan copil imbricate. La prima încărcare, locația fiecărui JarEntry este mapată la un decalaj de fișier fizic al borcanului exterior, așa cum se arată în următorul exemplu:

Exemplul precedent arată cum clasa A. poate fi găsită în/BOOT-INF/classes în myapp.jar la poziția 0063. B.class din borcanul imbricat poate fi de fapt găsit în myapp.jar la poziția 3452, iar C.class este la poziția 3980 .