Как организовать файлы из зависимостей в затененной банке Maven

Когда вы создаете толстый jar - файл с помощью maven-shade-plugin, могут возникнуть конфликты между файлами по одному и тому же пути, но из-за разных зависимостей. Точно так же становится трудно различить происхождение различных зависимых файлов, расположенных в корне отдельных зависимостей (LICENSE.txt, нативные библиотеки, ...), когда они размещены рядом в общих местах в затененных местах. баночка.

Сам maven-shade-plugin и аналогичный jarjar-maven-plugin, по- видимому, предоставляют функциональные возможности для автоматического перемещения классов, но не других файлов из зависимостей, таких как те, что показаны в следующем примере:

Пример текущей грязной структуры

/
  - NOTICE
  - magic.gz
  - LICENSE.txt
  - LICENSE
  - asm-license.txt
  / META-INF
    - LICENSE.TXT
    - about.html
  / com.some.library
    <class files>
  / com.some.other.library
    <class files>
  / com.some.third.library
    <class files>

Это пример из проекта, который я только начал. Ни один из файлов выше не был добавлен мной, но все они взяты из различных популярных сторонних библиотек, которые я использую. Я бы хотел устранить эту проблему, если бы Maven реорганизовал файлы в общую структуру пакета, как в следующем примере:

Пример желаемой чистой структуры

/
  / com.some.library
    <class files>
    - NOTICE
    - LICENSE
    / META-INF
      - about.html
  / com.some.other.library
    <class files>
    - magic.gz
    - LICENSE.txt
  / com.some.third.library
    <class files>
    - asm-license.txt
    / META-INF
      - LICENSE.TXT

У меня много зависимостей, поэтому я не считаю, что написание зависимых от зависимостей фильтров / relocators /... с жестко закодированными именами файлов - хорошее решение этой проблемы.

Как автоматически организовать все файлы из зависимостей в затененном банке? В идеале, перемещая все файлы из зависимости внутри подпапки, названной в честь зависимости.

1 ответ

Это не похоже на лучшую практику Maven... но, как говорится, один из возможных способов сделать это - создать собственный плагин Maven на основе maven-shade-plugin. Кодовая база довольно проста. Вы могли бы реализовать org.apache.maven.plugins.shade.resource.ResourceTransformer и позвони в org.apache.maven.plugins.shade.DefaultShader класс, когда он перечисляет каждую запись Jar & Jar (вы можете организовать ресурс по имени jar, возможно). Если вы хотите базовую реализацию, я опубликую ее.

Другие вопросы по тегам