Как уже упоминалось в моем ответе в MessageBodyProviderNotFoundException при запуске jar из командной строки , существует «файл служб», а именно org.glassfish.jersey.internal.spi.AutoDiscoverable
, который включен во многие jar.Цель этого файла - разрешить банкам Джерси (и других сторонних производителей) предоставлять некоторую автоматическую регистрацию для функций, включенных в эти банки.Это включает в себя регистрацию JacksonFeature
, которая регистрирует JSON-провайдеров, которые обрабатывают (де) сериализацию.
Проблема с созданием толстых (uber) jar заключается в том, что может быть только один из этих файлов (вы можете 'не может иметь более одного файла с тем же именем).Таким образом, со всеми банками, включенными в толстую банку, будет включен только один служебный файл.
В Maven мы будем использовать maven-shade-plugin, который имеет преобразователи, которые позволяют преобразовывать части сборки.Плагин Shade имеет ServicesResourceTransformer
, который обеспечивает объединение содержимого служебных файлов в один служебный файл.Плагин, который вы используете для Gradle, Shadow , имеет те же возможности.Вы настраиваете это, вызывая mergeServiceFiles()
в конфигурации.На самом деле я не работаю с Gradle, но также указал в эту проблему , рекомендуемая конфигурация для обработки как преобразования служебных файлов, так и преобразования манифеста основного класса:
shadowJar {
mergeServiceFiles()
manifest {
attributes 'Main-Class': 'com.my.Application'
}
}
Таким образом, я предполагаю, что с вышеуказанной конфигурацией вы также можете удалить
jar { manifest { attributes 'Main-Class': "${mainClassName}" } }
, так как плагин Shadow позаботится о создании манифеста.Опять же, я на самом деле не использую Gradle, так что это всего лишь предположение;но это звучит правильно.