Как заставить maven-assembly-plugin уважать исключения, определенные в pom.xml?

TL; DR

Когда некоторые (конкретные) переходные зависимостиисключен в файле POM нодескриптор сборки установлен для выборки всех зависимостей,исключенные зависимости будут включены в сборе.Как я могу предотвратить это?

Немного фона

Некоторые зависимости могут быть сложными для обработки, потому что их groupIds и artifactIds меняются почти в каждой версии (в моем случае, bouncycastle).

Я получаю несколько версий Bouncycastle (138, 1,38, 1,45 и 1,50). Моя цель - исключить все версии, кроме 1.50. Если быть точным, у меня есть одна зависимость (давайте назовем этоsome.perfectly.done:job) который импортирует 1,50 и еще один (how.many.castles:do-you-need) который импортирует все остальные. Они являются корпоративными зависимостями, поэтому предоставление реального groupId: artifactId не поможет вам в тестировании.

pom.xml

Мои зависимости объявлены следующим образом:

<dependency>
    <groupId>some.perfectly.done</groupId>
    <artifactId>job</artifactId>
</dependency>
<dependency>
    <groupId>how.many.castles</groupId>
    <artifactId>do-you-need</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.bouncycastle</groupId>
            <artifactId>*</artifactId>
        </exclusion>
        <exclusion>
            <groupId>bouncycastle</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>
assembly.xml
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
    <id>bin</id>
    <formats>
        <format>zip</format>
    </formats>

    <!-- Adds dependencies to zip package under lib directory -->
    <dependencySets>
        <dependencySet>
            <useProjectArtifact>false</useProjectArtifact>
            <useTransitiveFiltering>true</useTransitiveFiltering>
            <outputDirectory>lib</outputDirectory>
                        <outputFileNameMapping>${artifact.groupId}.${artifact.artifactId}-${artifact.version}${dashClassifier?}.${artifact.extension}</outputFileNameMapping>
            <unpack>false</unpack>
        </dependencySet>
    </dependencySets>
    <!-- ... -->
</assembly>
Что я получаю
$ ls *bouncycastle*
bouncycastle.bcmail-jdk14-138.jar       org.bouncycastle.bcmail-jdk15on-1.50.jar  org.bouncycastle.bcprov-jdk15-1.45.jar
bouncycastle.bcprov-jdk14-138.jar       org.bouncycastle.bcpkix-jdk15on-1.50.jar  org.bouncycastle.bcprov-jdk15on-1.50.jar
org.bouncycastle.bcmail-jdk14-1.38.jar  org.bouncycastle.bcprov-jdk14-1.38.jar    org.bouncycastle.bctsp-jdk14-1.38.jar
Что я ожидаю (и нужно)
$ ls *bouncycastle*
org.bouncycastle.bcmail-jdk15on-1.50.jar  org.bouncycastle.bcpkix-jdk15on-1.50.jar  org.bouncycastle.bcprov-jdk15on-1.50.jar
Некоторые возможные ведет к созданию

Реальная ценность в ответе здесь будет найтиреальный, общий решение. Я не ищу, чтобы решитьмой случае, я хотел бы найти решение для всех людей с подобным случаем.

Таким образом, я бы хотел избежать некоторых решений, которые бы работали, но на самом деле связаны с конкретным случаем и часто требуют дублирования логики POM в дескрипторе сборки.

Это, однако, выводы, которые могут помочь, если не найти ничего лучшего.

Воспроизведите шаблон исключения внутри дескриптора сборки

Очевидно. В моем собственном случае, однако, довольно непрактично, за исключением разумного использованияincludes/excludes, Это не практическое решение.

Сделайте несколько наборов зависимостей

Обратите внимание, что я в курсеэтот вопрос уже задавался, но единственная попытка ответа неудовлетворительна для моего случая:

Если у вас есть такая вещь, вам нужно определить две записи dependencySet, одна из которых включает logback [сuseTransitiveDependencies=false] и другие.

(отkhmarbaise)

использованиеmaven-dependency-plugin

Натот же вопрос, что и выше, подход, который я мог бы использовать, если не задан вопрос: первое использованиеdependency:copy-dependencies чтобы скопировать мои правильные зависимости во временный каталог, а затем собрать мой zip из этого каталога.

В качестве обходного пути, это, вероятно, самое правильное решение, поскольку оно является общим и не дублирует логику из POM в дескрипторе сборки, хотя это делает сборку более длинной.

Дополнительный вопрос: почему?

Почемуmaven-assembly-plugin вести себя так? Я не нашел ссылки на это в документации. Это желаемое поведение или это (известная / неизвестная) ошибка?

Ответы на вопрос(2)

Ваш ответ на вопрос