Как организовать файлы из зависимостей в затененной банке 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, возможно). Если вы хотите базовую реализацию, я опубликую ее.