Виконуваний формат Jar

Модулі spring-boot-loader дозволяють Spring Boot підтримувати виконувані файли jar та war. Якщо ви використовуєте плагін Maven або плагін Gradle, виконувані банки генеруються автоматично, і вам, як правило, не потрібно знати подробиці того, як вони працюють.

Spring Boot

Якщо вам потрібно створити виконувані банки з іншої системи збірки, або якщо вам просто цікаво, що лежить в основі технології, цей додаток містить деяку довідкову інформацію.

1. Вкладені JAR

Java не забезпечує жодного стандартного способу завантаження вкладених файлів jar (тобто файлів jar, які самі містяться в jar). Це може бути проблематично, якщо вам потрібно розповсюдити автономну програму, яку можна запустити з командного рядка без розпакування.

Для вирішення цієї проблеми багато розробників використовують «затінені» банки. Заштрихована банка упаковує всі класи, з усіх банок, в одну «банку uber». Проблема затінених банок полягає в тому, що стає важко зрозуміти, які бібліотеки насправді є у вашому додатку. Це також може бути проблематично, якщо в декількох банках використовується одне і те ж ім'я файлу (але з різним вмістом). Spring Boot використовує інший підхід і дозволяє вам фактично гніздити банки безпосередньо.

1.1. Структура файлу виконуваного файлу Jar

Файли jar, сумісні з Spring Boot Loader, повинні бути структуровані таким чином:

Класи додатків слід розміщувати у вкладеному каталозі BOOT-INF/classes. Залежності слід розміщувати у вкладеному каталозі BOOT-INF/lib.

1.2. Структура файлів, що виконуються

Військові файли, сумісні з Spring Boot Loader, повинні бути структуровані таким чином:

Залежності слід розміщувати у вкладеному каталозі WEB-INF/lib. Будь-які залежності, які потрібні при запуску вбудованого, але не потрібні при розгортанні в традиційному веб-контейнері, слід розміщувати у WEB-INF/lib .

1.3. Індексні файли

Архіви jar і war, сумісні з Spring Boot Loader, можуть включати додаткові файли індексу в каталог BOOT-INF /. Файл classpath.idx може бути наданий як для банок, так і для війн, він забезпечує порядок додавання банок до шляху до класу. Файл layer.idx можна використовувати лише для банок, він дозволяє розділити банку на логічні шари для створення зображення Docker/OCI.

Індексні файли відповідають синтаксису, сумісному з YAML, так що їх можна легко проаналізувати за допомогою сторонніх інструментів. Однак ці файли не аналізуються внутрішньо як YAML, і вони повинні бути записані в точно описаних нижче форматах, щоб використовувати.

1.4. Індекс шляху до класу

Індексний файл classpath можна надати в BOOT-INF/classpath.idx. Він надає список назв jar (не включаючи каталог) у тому порядку, в якому їх слід додати до шляху до класу. Кожен рядок повинен починатися з пробілу ("- ·"), а імена повинні бути в подвійних лапках.

Наприклад, враховуючи таку банку:

Файл індексу буде виглядати так:

1.5. Індекс шару

Файл індексів шарів можна надати в BOOT-INF/layer.idx. Він надає перелік шарів та частин банки, які повинні міститися в них. Шари записуються в тому порядку, що їх слід додати до образу Docker/OCI. Назви шарів записуються у вигляді рядків із лапками, префіксом яких є пробіл ("- ·") та суфіксом двокрапки (":") Вміст шару - це або файл, або ім'я каталогу, записане як рядок із цитуваннями, префіксом якого є пробіл тире пробіл ("·· - ·"). Ім'я каталогу закінчується на /, ім'я файлу - ні. Коли використовується ім'я каталогу, це означає, що всі файли всередині цього каталогу знаходяться в одному шарі.

Типовим прикладом індексу шарів може бути:

2. Клас “JarFile” Spring Boot

Основним класом, що використовується для підтримки завантаження вкладених банок, є org.springframework.boot.loader.jar.JarFile. Це дозволяє завантажувати вміст jar зі стандартного файлу jar або із вкладених даних дочірнього jar. При першому завантаженні розташування кожного JarEntry відображається у зсув фізичного файлу зовнішньої банки, як показано в наступному прикладі:

Попередній приклад показує, як A.class можна знайти в/BOOT-INF/класах у myapp.jar у позиції 0063. B.class із вкладеної банки насправді можна знайти в myapp.jar у позиції 3452, а C.class - у позиції 3980 .