На первый взгляд, это не имеет большого значения. Причина этого в том, что система упаковки Java действительно сформировалась и за долгие годы стала сильной. Многие другие экосистемы не извлекают из этого выгоду и могут получить большую выгоду от упаковки в образ контейнера. Но контейнеры - это не только упаковка. Упаковку можно было считать ее побочным эффектом.
Среди прочего, некоторые преимущества использования контейнеров по сравнению с простыми Fat JARS:
Упрощенная инфраструктура
Для большого (или среднего) предприятия построенные на микросервисах, есть вероятность, что не все из них используют одни и те же языки и инструменты. Контейнер обеспечивает предсказуемый способ развертывания всех этих разных вещей одним и тем же способом, поэтому он значительно упрощает инфраструктуру, тем самым значительно сокращая расходы компании. Это становится еще более важным при развертывании в облаке, особенно в сценарии с несколькими облачными провайдерами ios, и в этом случае оркестровка контейнеров, обеспечиваемая таким программным обеспечением, как Kubernetes, очень помогает без особых усилий.
Согласованность
Еще одно преимущество контейнеров перед обычными JAR - согласованность между средами. Представьте, например, что вы развертываете свой JAR в DEV (выполняется Java 8), а затем в PROD (работает Java 10). По какой-то причине JVM ведет себя по-разному, либо из-за сборщика мусора по умолчанию, либо из-за чего-то еще, что заставляет вашу программу вести себя по-разному в обеих средах. При развертывании через образ контейнера один и тот же образ будет использоваться в разных средах, поэтому всегда будет использоваться одна и та же версия Java, что снижает вероятность ошибок.
Изоляция ресурсов
Еще одно преимущество - изоляция ресурсов. Контейнеры могут гарантировать, что ваше приложение «видит» только заранее определенный объем памяти и процессоров. На самом деле, в Java 10 были некоторые улучшения по этому поводу, вы можете прочитать об этом здесь .
Надеюсь, это дает лучшую точку зрения по этому вопросу.