Estou tentando encontrar uma maneira “genérica” de excluir uma dependência transitiva de ser incluída sem ter que excluí-la de todas as dependências que dependem dela. Por exemplo, se eu quiser excluir slf4j, faço o seguinte:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-jmx</artifactId>
<version>3.3.2.GA</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>3.4.0.GA</version>
<type>jar</type>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
Isso é parcialmente para limpar o arquivo pom, parcialmente para evitar problemas no futuro com pessoas adicionando dependências que dependem dessa dependência excluída - e esquecendo-se de excluí-la.
Há algum caminho?
maven
maven-2
dependencies
pom.xml
Sébastien Le Callonnec
fonte
fonte
Respostas:
Isso ajuda? http://jlorenzen.blogspot.com/2009/06/maven-global-excludes.html
"Supondo que eu queira excluir o framework avalon do meu WAR, eu adicionaria o seguinte aos meus projetos POM com um escopo fornecido. Isso funciona em todas as dependências transitivas e permite que você especifique uma vez.
<dependencies> <dependency> <artifactId>avalon-framework</artifactId> <groupId>avalon-framework</groupId> <version>4.1.3</version> <scope>provided</scope> </dependency> </dependencies>
Isso funciona até mesmo ao especificá-lo no POM pai, o que evitaria que os projetos precisassem declarar isso em todos os POMs filhos. "
fonte
runtime
escopo em vez doprovided
escopo?Eu criei um jar vazio e criei esta dependência:
<dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <scope>system</scope> <systemPath>${basedir}/src/lib/empty.jar</systemPath> <version>0</version> </dependency>
Não é perfeito porque a partir de agora você tem um jar vazio em seu caminho de compilação / teste. Mas isso é apenas cosmético.
fonte
system
escopo agora está obsoleto: maven.apache.org/guides/introduction/…system
escopo, consulte o repositório virtual Maven versão99.grons.nl (Aviso: apenas HTTP) ou (para commons-logging / log4j apenas) consulte a "alternativa 3) artefatos vazios" aqui: slf4j.org/faq.html#excludingJCLPara expandir o comentário de dnault :
É possível usar a regra Banned Dependencies do plug-in Maven Enforcer para garantir que as dependências sejam excluídas. Ainda é preciso excluí-los manualmente, mas a construção falhará se alguém adicionar a dependência em outro lugar por engano.
<dependencies> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-jmx</artifactId> <version>3.3.2.GA</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-enforcer-plugin</artifactId> <version>1.4.1</version> <executions> <execution> <goals> <goal>enforce</goal> </goals> <configuration> <rules> <bannedDependencies> <excludes> <exclude>org.slf4j:slf4j-api</exclude> </excludes> </bannedDependencies> </rules> </configuration> </execution> </executions> </plugin> </plugins>
Também há uma solicitação de recurso aberta: MNG-1977 Global dependency exclusions
fonte
Como um lembrete, aqui está a resposta da documentação oficial do Maven:
Se alguém quiser tornar uma construção mais robusta, um intervalo de versões pode ser usado. Isso garantiria que nenhuma versão mais recente da dependência possa interferir no projeto.
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>[1.4.2,)</version> <scope>provided</scope> </dependency>
Qualquer versão slf4j-api> = 1.4.2 será considerada como oferecida (fornecida) em tempo de execução, seja de um classpath configurado ou um contêiner.
Referências
fonte