Como o maven-assembly-plugin respeita as exclusões definidas no pom.xml?

TL; DR

Quando algumas dependências transitivas (específicas) sãoexcluído no arquivo POM mas oo descritor de assembly está definido para buscar todas as dependências, adependências excluídas serão incluídas em montagem.Como posso evitar isso?

Um pouco de fundo

Algumas dependências podem ser difíceis de manipular porque seus groupIds e artifactIds mudam em quase todas as versões (no meu caso, bouncycastle).

Estou recuperando várias versões do castelo inflável (138, 1,38, 1,45 e 1,50). Meu objetivo é eliminar todas as versões que não sejam a 1,50. Para ser mais preciso, tenho uma dependência (vamos chamá-losome.perfectly.done:job) que importa 1,50 e outro (how.many.castles:do-you-need) que importa todos os outros. São dependências corporativas, portanto, fornecer ID de grupo real: ID de artefato não ajudaria em testes.

pom.xml

Minhas dependências são declaradas da seguinte maneira:

<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>
O que eu ganho
$ 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
O que eu espero (e preciso)
$ ls *bouncycastle*
org.bouncycastle.bcmail-jdk15on-1.50.jar  org.bouncycastle.bcpkix-jdk15on-1.50.jar  org.bouncycastle.bcprov-jdk15on-1.50.jar
Algumas pistas possíveis para se basear

O valor real em uma resposta aqui seria encontrar umreal, genérico solução. Eu não estou olhando para resolvermeu Nesse caso, gostaria de encontrar uma solução para todas as pessoas com um caso semelhante.

Como tal, eu gostaria de evitar algumas soluções que funcionariam, mas que estão realmente relacionadas a um caso específico e, muitas vezes, exigem duplicar a lógica do POM no descritor de montagem.

No entanto, esses leads podem ajudar se nada melhor puder ser encontrado.

Reproduzir o padrão de exclusão dentro do descritor de montagem

Obviamente. No meu caso, porém, bastante impraticável, exceto pelo uso inteligente deincludes/excludes. Esta não é uma solução prática.

Faça vários conjuntos de dependências

Note que estou cienteesta pergunta já foi feita, mas a única tentativa de resposta é insatisfatória para o meu caso:

Se você tem isso, precisa definir duas entradas dependencySet, uma que inclua o logback [comuseTransitiveDependencies=false] e outro.

(porkhmarbaise)

Usarmaven-dependency-plugin

Ema mesma pergunta acima, uma abordagem que eu possa usar se nenhuma pergunta for proposta: primeiro usodependency:copy-dependencies para copiar minhas dependências corretas para um diretório temporário e montar meu zip a partir deste diretório.

Como solução alternativa, essa é provavelmente a solução mais válida, pois é genérica e não duplica a lógica do POM no descritor de assembly, embora isso torne a construção mais longa.

Pergunta secundária: Por quê?

Por que omaven-assembly-plugin se comportar assim? Não encontrei nenhuma referência a isso na documentação. É o comportamento desejado ou é um bug (conhecido / desconhecido)?

questionAnswers(3)

yourAnswerToTheQuestion