No Maven2, para excluir uma única dependência transitiva, eu tenho que fazer algo assim:
<dependency>
<groupId>sample.group</groupId>
<artifactId>sample-artifactB</artifactId>
<version>1</version>
<exclusions>
<exclusion>
<groupId>sample.group</groupId>
<artifactId>sample-artifactAB</artifactId>
</exclusion>
</exclusions>
</dependency>
O problema com essa abordagem é que eu tenho que fazer isso para todas as dependências transitivas contribuídas por sample-artifactB
.
Existe uma maneira de usar algum tipo de curinga para excluir todas as dependências transitivas de uma só vez, em vez de uma por uma?
maven-2
dependencies
pbreault
fonte
fonte
Respostas:
Para o maven2, não há como fazer o que você descreve. Para o maven 3, existe. Se você estiver usando o maven 3, consulte outra resposta para esta pergunta
Para o maven 2, eu recomendo criar seu próprio pom personalizado para a dependência que tem suas <exclusões>. Para projetos que precisam usar essa dependência, configure a dependência para seu pom personalizado em vez do artefato típico. Embora isso não permita necessariamente excluir todas as dependências transitivas com uma única <exclusão>, permite que você precise gravar sua dependência apenas uma vez e todos os seus projetos não precisem manter listas de exclusão longas e desnecessárias.
fonte
O que funcionou para mim (pode ser um recurso mais recente do Maven) é apenas fazer curingas no elemento de exclusão.
Eu tenho um projeto de vários módulos que contém um módulo "app" que é referenciado em dois módulos empacotados em WAR. Um desses módulos empacotados com WAR realmente precisa apenas das classes de domínio (e ainda não as separei do módulo de aplicativo). Eu achei que isso funcionava:
O curinga em groupId e artifactId exclui todas as dependências que normalmente seriam propagadas para o módulo usando essa dependência.
fonte
Uma coisa que achei útil:
Se você colocar a dependência com as exclusões na seção dependencyManagement do POM pai do seu projeto ou em um POM importável de gerenciamento de dependências, não será necessário repetir a exclusão (ou a versão).
Por exemplo, se o POM pai tiver:
Em seguida, os módulos em seu projeto podem simplesmente declarar a dependência como:
O POM pai especificará a versão e as exclusões. Eu uso essa técnica para quase todos os nossos projetos e elimina muita repetição.
fonte
Há três anos, eu recomendei o uso da versão 99 não existe, mas agora descobri uma maneira melhor, principalmente porque a versão 99 está offline:
No POM pai do seu projeto, use o maven-enforcer-plugin para falhar na compilação se a dependência indesejada se infiltrar na compilação. Isso pode ser feito usando a regra de dependências banidas do plug-in :
Então, quando isso alertar sobre uma dependência indesejada, exclua-a na
<dependencyManagement>
seção do POM pai :Dessa forma, a dependência indesejada não será exibida acidentalmente (ao contrário de uma
<exclusion>
que é fácil de esquecer), ela não estará disponível mesmo durante o tempo de compilação (ao contrário doprovided
escopo), não haverá dependências falsas (ao contrário da versão 99) e será ' funcionará sem um repositório personalizado (diferente da versão 99). Essa abordagem funcionará mesmo com a versão do artefato, classificadores, escopo ou um groupId inteiro - consulte a documentação para obter detalhes.fonte
<configuration>
é ignorado ao executar a meta na linha de comando e deve ser movido diretamente para cima<plugin>
.<dependencyManagement>
seção dos pais . A execução de ummvn dependency:tree
nesse projeto específico não terá a dependência excluída. Mas todos os projetos que importam essa dependência não honrarão o<exclusions>
pom do outro pai do projeto - o excluído entrará em cena !!! Eu tive que mudar<exclusions>
para cada módulo pom diretamente.Eu uso a seguinte solução alternativa: em vez de tentar excluir o artefato em todas as dependências apropriadas, desenho a dependência como "fornecida" no nível superior. Por exemplo, para evitar o envio de xml-apis "seja qual for a versão":
fonte
Atualmente, não há como excluir mais de uma dependência transitiva por vez, mas há uma solicitação de recurso para isso no site do Maven JIRA:
https://issues.apache.org/jira/browse/MNG-2315
fonte
Existe uma solução alternativa para isso, se você definir o escopo de uma dependência como tempo de execução , as dependências transitivas serão excluídas. Embora esteja ciente, isso significa que você precisará adicionar processamento adicional se desejar compactar a dependência do tempo de execução.
Para incluir a dependência de tempo de execução em qualquer pacote, é possível usar a meta de cópia do plug-in maven-dependency-plugin para um artefato específico .
fonte
<scope>provided</scope>
vez disso<scope>runtime</scope>
.se você precisar excluir todas as dependências transitivas de um artefato de dependência que você incluirá em um assembly, poderá especificar isso no descritor do assembly-plugin:
fonte
Se você desenvolver no Eclipse, poderá, no gráfico de dependência do Editor POM (guias avançadas ativadas), procurar a dependência que deseja excluir do seu projeto e, em seguida:
clique com o botão direito do mouse -> "Excluir artefato Maven ..." e o Eclipse fará a exclusão para você sem a necessidade de descobrir em qual dependência a biblioteca está vinculada.
fonte
Qual é o seu motivo para excluir todas as dependências transitivas?
Se houver um artefato específico (como log comum) que você precise excluir de todas as dependências, a abordagem Versão 99 Não Existe pode ajudar.
Atualização 2012: não use essa abordagem. Use o maven-enforcer-plugin e exclusões . A versão 99 produz dependências falsas e o repositório da versão 99 está offline (existem espelhos semelhantes, mas você também não pode confiar neles para ficar online para sempre; é melhor usar apenas o Maven Central).
fonte
Em uma questão semelhante, tive a dependência desejada declarada com o escopo fornecido. Com essa abordagem, as dependências transitivas são buscadas, mas NÃO são incluídas na fase do pacote, que é o que você deseja. Também gosto desta solução em termos de manutenção, porque não há pom, nem pom personalizado como na solução da whaley, necessária para manter; você só precisa fornecer a dependência específica no contêiner e ser feito
fonte
Use o último maven no seu caminho de classe. Ele removerá os artefatos duplicados e manterá o último artefato.
fonte