Обработка повторяющихся записей в заштрихованном (uber/fat) jar-файле
Я создал файл jar, созданный из нескольких jar (в этом случае я использовал плагин Gradle Shadow).
Оказалось, что файл содержит дубликаты файлов в /META-INF
, Большинство из них являются множественными license.txt
из оригинальных файлов jar, но некоторые из них - фабрики Spring, которые меня интересуют.
Такое поведение кажется распространенным при использовании различных инструментов, похожих на fatjar, с Maven или Gradle, и похоже, что оно не запрещено никакими средствами.
Я проверил это java.lang.ClassLoader#getResources
вернет эти записи в виде списка одинаковых URL, например:
jar:file:/C:/temp/myJar.jar!/META-INF/spring.factories
jar:file:/C:/temp/myJar.jar!/META-INF/spring.factories
поэтому, как только я получу URL-адрес, уже нет способа получить содержимое всех дублированных файлов программным путем.
Может ли Java обрабатывать такие дубликаты, как-нибудь?
Или, может быть, более общий вопрос, является ли допустимой и поддерживаемой ситуацией, с точки зрения спецификации, наличие фляги с дублирующимися файлами внутри? Я проверил Jar File Specification, и он также не дал мне никакой подсказки.
1 ответ
В maven-shade-plugin
это делается с помощью AppendingTransformer.
Моя интерпретация используемой вами документации по подключаемому модулю заключается в следующем:
shadowJar {
append('META-INF/spring.factories')
}