Обработка повторяющихся записей в заштрихованном (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')
}
Другие вопросы по тегам