Mi proyecto gradle usa el application
complemento para crear un archivo jar. Como parte de las dependencias transitivas del tiempo de ejecución, termino entrando org.slf4j:slf4j-log4j12
. (Se hace referencia a ella como una dependencia sub-transitiva en al menos 5 o 6 otras dependencias transitivas; este proyecto está usando spring y hadoop, por lo que todo, excepto el fregadero de la cocina, se está tirando ... no, espera ... eso también está ahí :) ).
Quiero excluir globalmente el slf4j-log4j12
jar de mi jar construido. Entonces probé esto:
configurations {
runtime.exclude group: "org.slf4j", name: "slf4j-log4j12"
}
Sin embargo, esto parece excluir todos los org.slf4j
artefactos incluidos slf4j-api
. Cuando se ejecuta en modo de depuración, veo líneas 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).
No quiero tener que buscar la fuente de cada slf4j-log4j12
dependencia transitiva y luego tener compile foo { exclude slf4j... }
declaraciones individuales en mi dependencies
bloque.
Actualizar:
También probé esto:
configurations {
runtime.exclude name: "slf4j-log4j12"
}
¡Lo que termina excluyendo todo de la construcción! Como si lo hubiera especificado group: "*"
.
Actualización 2:
Estoy usando Gradle versión 1.10 para esto.
Respuestas:
Ah, lo siguiente funciona y hace lo que quiero:
Parece que una regla de exclusión solo tiene dos atributos:
group
ymodule
. Sin embargo, la sintaxis anterior no le impide especificar ninguna propiedad arbitraria como predicado. Al intentar excluir de una dependencia individual, no puede especificar propiedades arbitrarias. Por ejemplo, esto falla:con
Entonces, aunque puede especificar una dependencia con a
group:
yname:
no puede especificar una exclusión con aname:
!?!Quizás una pregunta separada, pero ¿ qué es exactamente un módulo entonces? Puedo entender la noción de Maven de groupId: artifactId: version, que entiendo se traduce en group: name: version en Gradle. Pero entonces, ¿cómo sé a qué módulo (en lenguaje gradle) pertenece un artefacto Maven en particular?
fuente
configurations { runtime.exclude group: '*' }
.Para excluir una o más bibliotecas globalmente, agregue lo siguiente a su build.gradle
Ahora el bloque de exclusión tiene dos grupos de propiedades y un módulo . Para aquellos de ustedes que vienen de la experiencia de Maven , el grupo es el mismo que el ID de grupo y el módulo es el mismo que el ID de artefacto . Ejemplo: Para excluir com.mchange: c3p0: 0.9.2.1 lo siguiente debe ser bloque de exclusión
fuente
Tu enfoque es correcto. (Dependiendo de las circunstancias, es posible que desee utilizar
configurations.all { exclude ... }
). Si estas exclusiones realmente excluyen más de una dependencia (nunca me he dado cuenta de eso al usarlas), presente un error en http://forums.gradle.org , idealmente con un ejemplo reproducible.fuente
configurations.all{}
es exactamente lo que estaba buscando. Gracias por la publicación Peteren el siguiente ejemplo excluyo
fuente
Estaba usando Spring Boot 1.5.10 e intento excluir el logback, la solución dada arriba no funcionó bien, en su lugar uso configuraciones
fuente
Además de lo que dijo @ berguiga-mohamed-amine, acabo de descubrir que un comodín requiere dejar el argumento del módulo como una cadena vacía:
fuente