#maven-shade-plugin
Вопрос:
Я затеняю проект с большим количеством зависимостей. Мне нужно сохранить все из исходного артефакта и включить только классы из других проектов. Звучит просто, не так ли? Единственная проблема в том, что идентификаторы групп повсюду, и я, похоже, не могу получить чистую конфигурацию.
<filter>
<artifact>*:*</artifact>
<includes>
<include>**/*.class</include>
</includes>
</filter>
<filter>
<artifact>${project.groupId}:${project.artifactId}</artifact>
<includes>
<include>**</include>
</includes>
</filter>
Это, очевидно, не работает, потому что каждый фильтр сохраняет только то, что он отфильтровал, поэтому ресурсы в исходном артефакте теряются.
Я не хочу добавлять фильтр для каждого артефакта. Их слишком много, и почему я снова и снова повторяю тег зависимостей. Я также не хочу выбирать ресурсы для исключения из зависимостей, потому что я не всегда знаю, что это такое, и я не хочу вносить в них изменения здесь (хотя на данный момент я пошел по этому пути).
Набор артефактов не помогает, потому что он включает или исключает только артефакт, и DontIncludeResourceTransformer также не помогает, поскольку он действует на конечный отфильтрованный набор ресурсов.
Что может быть полезным, так это разрешить фильтрам находиться в наборе артефактов:
<artifactSet>
<includes>
<include>*:*</include>
</includes>
<filters>
<filter>
<includes>
<include>**/*.class</include>
</includes>
</filter>
</filters>
</artifactSet>
<artifactSet>
<includes>
<include>${project.groupId}:${project.artifactId}</include>
</includes>
</artifactSet>
В качестве альтернативы создайте тег «Набор фильтров», который будет разветвлять операции фильтрации и объединять ресурсы в конце:
<filters>
<filterSet>
<filter>
<artifact>*:*</artifact>
<includes>
<include>**/*.class</include>
</includes>
</filter>
</filterSet>
<filterSet>
<filter>
<artifact>${project.groupId}:${project.artifactId}</artifact>
<includes>
<include>**</include>
</includes>
</filter>
</filterSet>
</filters>
Alternatively, add a boolean «branch/preserve/pin» tag in the filter:
<filter>
<artifact>*:*</artifact>
<includes>
<include>**/*.class</include>
</includes>
</filter>
<filter>
<artifact>${project.groupId}:${project.artifactId}</artifact>
<preserve>true</preserve>
</filter>
I see also that
As of version 1.6, minimizeJar will respect classes that were
specifically marked for inclusion in a filter.
But I’d still like to refine the final set of classes to what is actually needed. So filter including **/*.class is out, since there’s no switch to configure minimizeJar behaviour.
It looks like the maven-assembly-plugin can’t help, so I’ve had to go with this and hope for the best
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>**/*.sql</exclude>
<exclude>**/*.xsd</exclude>
<exclude>**/*.json</exclude>
<exclude>**/*.bat</exclude>
<exclude>**/*.dll</exclude>
<exclude>**/*.lib</exclude>
<exclude>**/*.properties</exclude>
<exclude>**/*.exclude</exclude>
...
</excludes>
</filter>