Не будуйте жирові банки для програм Docker фірми Jan Weinschenker Holisticon Consultants Medium
При створенні програм Java за допомогою Maven, таких як програми Spring Boot або Vert.x, популярним способом є об’єднання коду програми та всіх банок залежностей в одну банку жиру. Як правило, для цього використовується плагін Maven Shade.

Але чи справді це гарна ідея? При створенні мікросервісу код вашої програми буде скомпільований у кілька сотень кілобайт або пару мегабайт файлів класів. Це одне призведе до досить невеликого файлу jar.
Але зачекайте, поки плагін тіней не закінчиться. Він додасть файли класів усіх ваших залежностей до цього файлу jar. Раптом файл вашої програми може легко вирости до кількох сотень мегабайт.
Як згадував Джонатан Хабер у своїй великій статті кілька років тому, можна стверджувати, що банки там ніколи не мали на меті використовувати так. Крім того, піддається помилкам об'єднання великої кількості банок в один файл.
Класи з однаковим ім'ям та пакетом можуть існувати серед ваших залежностей. Який з них опиниться у вашій жирній банці?
На мою думку, більшою проблемою є неефективність. Якщо ви опублікуєте свою жирову банку у сховищі артефактів, ваші зв’язані залежності займуть місце для зберігання як окремі артефакти, одночасно зберігаючись як частина жирової банки. Це не має особливого сенсу, якщо ви запитаєте мене.
Побудова жирної банки займає багато часу. Поєднуючи вміст усіх банок залежностей, одночасно маючи справу з дублікатами файлів класів, ваша збірка займає більше часу, ніж потрібно. Це значна кількість вводу-виводу файлів, яку ваша інфраструктура CI повинна обробляти регулярно, тобто під час кожної збірки.
Запустити жирову банку як додаток Java досить просто:
Оскільки жирова банка є самостійною, це все, що вам потрібно.
Запуск jar-файлу, який вимагає додаткових банок, є більш складним. Ви не можете вказати -jar разом із -cp. Це не спрацює: