Pull to refresh

Comments 5

Используйте application плагин, он куда удобнее, не нужно добавлять зависимость на еще один плагин и он не является хаком как вся концепция shadow jar


А еще можно сделать руками кеширование базового слоя со всеми зависимостями используя только application plugin


TestNG при Junit 5 тоже выглядит странным, я бы не рекомендовал его сегодня как решение "по умолчанию"


Ну и нативный mockk куда лучше mockito-kotlin, конечно только если у вас уже не готовое приложение и вы мигрируете на Kotlin новые/старые тесты

Расскажите пожалуйста чем плоха идея self-executable jar'ок? Мне это казалось удобным способом дистрибьюции.

Например, несколько библиотек в приложении используют HOCON для конфигурации и предоставляют reference.conf с настройками по умолчанию в classpath. Такая конфигурация будет работать как есть в application плагине, а вот с shadowJar придется поплясать.


Спойлер

Не зря в shadow плагине есть куча мерджеров которые умеют склеивать (это к примеру) сервисы поставляемые через Service Loader API, да и вообще куча конфигурации которая нужна просто потому что shadow jar это хак. Хуже всего если у вас бинарные данные (набор картинок по одному урлу или конфигурация в протобаф, тут придется писать свой кастомный мерджер)


Можно зайти в issues и увидеть кучу проблем связанных с этим https://github.com/johnrengelman/shadow/issues/640


Второй момент — с shadow jar сложнее делать кеширующий слой в докере, для application я написал таску в пять строк которая делает две папки с базовыми либами и приложением, с shadow jar не знаю как это будет решаться.


Ну и в целом: два плагина + потенциальные проблемы с конфигурацией, вместо того что и так работает с дефолтным плагином? Тем более, чтобы запускать в докере? Нет, KISS

Спасибо. Переделал это. А можно взглянуть на таску с кеширующим слоем в докере?

Таска просто генерит папочки, остальная логика в Jenkins:
Смысл в таске такой (реализация подсмотрена в application/distibution плагине):


with(project.copySpec().apply {
  into("app")
  from(project(":$prj").tasks.jar)
})

with(project.copySpec().apply {
  into("app")
  from(project(":$prj").configurations.runtimeClasspath)
})
Sign up to leave a comment.

Articles