Os artefatos de dependências podem ser excluídos declarando um <exclusions>
elemento dentro de um <dependency>
Mas, neste caso, é necessário excluir um artefato herdado de um projeto pai. Segue um trecho do POM em discussão:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>test</groupId>
<artifactId>jruby</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<artifactId>base</artifactId>
<groupId>es.uniovi.innova</groupId>
<version>1.0.0</version>
</parent>
<dependencies>
<dependency>
<groupId>com.liferay.portal</groupId>
<artifactId>ALL-DEPS</artifactId>
<version>1.0</version>
<scope>provided</scope>
<type>pom</type>
</dependency>
</dependencies>
</project>
base
artefato, depende javax.mail:mail-1.4.jar
e ALL-DEPS
depende de outra versão da mesma biblioteca. Devido ao fato mail.jar
de ALL-DEPS
existir no ambiente de execução, embora não seja exportado, colide com o mail.jar
que existe no pai, cujo escopo é o compile
.
Uma solução poderia ser livrar o mail.jar do POM pai, mas a maioria dos projetos que herdam a base precisa disso (como é uma dependência perturbadora do log4j). Então, o que eu gostaria de fazer é simplesmente excluir a biblioteca do pai do projeto filho , pois isso poderia ser feito se base
fosse uma dependência e não o pom do pai:
...
<dependency>
<artifactId>base</artifactId>
<groupId>es.uniovi.innova</groupId>
<version>1.0.0</version>
<type>pom<type>
<exclusions>
<exclusion>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
</exclusion>
</exclusions>
</dependency>
...
Você pode agrupar suas dependências em um projeto diferente com o empacotamento,
pom
conforme descrito pelas Práticas recomendadas do Sonatypes :e referenciá-los do seu pai-pom (observe a dependência
<type>pom</type>
):Seu projeto filho herda esse pom pai como antes. Mas agora, a dependência de email pode ser excluída no projeto filho dentro do
dependencyManagement
bloco:fonte
Não use um pom pai
Isso pode parecer extremo, mas da mesma forma que "inferno de herança" é uma razão pela qual algumas pessoas dão as costas à Programação Orientada a Objetos (ou preferem composição a herança ), removem o
<parent>
bloco problemático e copiam e colam o que<dependencies>
você precisar (se sua equipe fornecer a você essa liberdade).A suposição de que a divisão dos poms em pai e filho para "reutilização" e "prevenção de redunância" deve ser ignorada e você deve atender às suas necessidades imediatas primeiro (a cura é pior que a doença). Além disso, a redundância tem suas vantagens - ou seja, independência de mudanças externas (ou seja, estabilidade).
Isso é mais fácil do que parece se você gerar o pom efetivo (o eclipse fornece, mas você pode gerá-lo na linha de comando
mvn help:effective
).Exemplo
Eu quero usar
logback
como minha ligação slf4j, mas meu pom pai inclui alog4j
dependência. Eu não quero ir e ter que colocar a dependência das outras crianças do log4j em seus própriospom.xml
arquivos, para que a minha fique desobstruída.fonte
Redefina a dependência (no pom filho) com o
scope
sistema apontando para um jar vazio:O jar pode conter apenas um único arquivo vazio:
fonte
notepad empty.class
em seguida,jar cvf empty.jar empty.class
para gerar um frasco vazio.Você já tentou declarar explicitamente a versão do mail.jar que deseja? A resolução de dependência do Maven deve usar isso para resolução de dependência em todas as outras versões.
fonte
A melhor aposta é fazer com que as dependências que você nem sempre deseja herdar sejam intransitivas.
Você pode fazer isso marcando-os no pom pai com o escopo fornecido.
Se você ainda deseja que o pai gerencie versões desses deps, pode usar a
<dependencyManagement>
tag para configurar as versões desejadas sem herdá-las explicitamente ou passar essa herança para os filhos.fonte
Quando você chama um pacote, mas não deseja algumas de suas dependências, pode fazer algo assim (nesse caso, não queria que o log4j antigo fosse adicionado porque precisava usar o mais novo):
Isso funciona para mim ... mas eu sou muito novo em java / maven, então talvez não seja o ideal.
fonte
Eu realmente precisava fazer essa coisa suja ... Aqui está como
Redefini essas dependências com escopo
test
. Escopoprovided
não funcionou para mim.Usamos o plugin Spring Boot para criar um jar gordo. Temos um módulo comum que define bibliotecas comuns, por exemplo, Springfox swagger-2. Meu super-serviço precisa ter um pai em comum (ele não deseja fazer isso, mas as regras da empresa são forçadas!)
Então, meu pai ou família tem pom.
E meu pom super-serviço .
Esse é o tamanho do artefato final de gordura
Também vale a pena mencionar esta resposta - eu queria fazê-lo, mas sou preguiçoso ... https://stackoverflow.com/a/48103554/4587961
fonte
Podemos adicionar o pai pom como uma dependência do tipo pom e fazer exclusão disso. Porque de qualquer forma pai pom é baixado. Isso funcionou para mim
fonte