Meu projeto gradle usa o application
plugin para construir um arquivo jar. Como parte das dependências transitivas do tempo de execução, eu acabo puxando org.slf4j:slf4j-log4j12
. (É referenciado como uma dependência subtransitiva em pelo menos 5 ou 6 outras dependências transitivas - este projeto está usando spring e hadoop, então tudo, exceto a pia da cozinha está sendo puxado ... não espere ... isso também está lá :) )
Quero excluir globalmente o slf4j-log4j12
jarro do meu jarro construído. Então, eu tentei isso:
configurations {
runtime.exclude group: "org.slf4j", name: "slf4j-log4j12"
}
No entanto, isso parece excluir todos os org.slf4j
artefatos, incluindo slf4j-api
. Ao executar no modo de depuração, vejo linhas como:
org.slf4j#slf4j-api is excluded from com.pivotal.gfxd:gfxd-demo-mapreduce:1.0(runtime).
org.slf4j#slf4j-simple is excluded from com.pivotal.gfxd:gfxd-demo-mapreduce:1.0(runtime).
org.slf4j#slf4j-log4j12 is excluded from org.apache.hadoop:hadoop-common:2.2.0(runtime).
Não quero ter que pesquisar a origem de cada slf4j-log4j12
dependência transitiva e, em seguida, ter compile foo { exclude slf4j... }
instruções individuais em meu dependencies
bloco.
Atualizar:
Eu também tentei isso:
configurations {
runtime.exclude name: "slf4j-log4j12"
}
O que acaba excluindo tudo do build! Como se eu especificasse group: "*"
.
Atualização 2:
Estou usando o Gradle versão 1.10 para isso.
Respostas:
Ah, o seguinte funciona e faz o que eu quero:
Parece que uma regra de exclusão tem apenas dois atributos -
group
emodule
. No entanto, a sintaxe acima não impede que você especifique qualquer propriedade arbitrária como um predicado. Ao tentar excluir de uma dependência individual, você não pode especificar propriedades arbitrárias. Por exemplo, isso falha:com
Portanto, embora você possa especificar uma dependência com um
group:
ename:
não possa especificar uma exclusão com umname:
!?!Talvez uma pergunta separada, mas o que exatamente é um módulo então? Eu posso entender a noção Maven de groupId: artifactId: version, que eu entendo que se traduz em group: name: version no Gradle. Mas então, como posso saber a qual módulo (na linguagem gradle) um determinado artefato Maven pertence?
fonte
configurations { runtime.exclude group: '*' }
.Para excluir uma ou mais bibliotecas globalmente, adicione o seguinte ao seu build.gradle
Agora, o bloco de exclusão possui dois grupos e módulos de propriedades . Para aqueles que têm experiência com o maven, group é igual a groupId e module é igual a artifactId . Exemplo: Para excluir com.mchange: c3p0: 0.9.2.1 o seguinte deve ser exclude block
fonte
Sua abordagem está correta. (Dependendo das circunstâncias, você pode querer usar
configurations.all { exclude ... }
.) Se essas exclusões realmente excluem mais de uma única dependência (nunca percebi isso ao usá-las), registre um bug em http://forums.gradle.org , de preferência com um exemplo reproduzível.fonte
configurations.all{}
é exatamente o que eu estava procurando. Obrigado pela postagem Peterno exemplo abaixo eu excluo
fonte
Eu estava usando o spring boot 1.5.10 e tento excluir o logback, a solução fornecida acima não funcionou bem, eu uso configurações em vez disso
fonte
Além do que @ berguiga-mohamed-amine afirmou, acabei de descobrir que um caractere curinga exige que o argumento do módulo seja deixado com a string vazia:
fonte