true stored false exclude dependency builds are gradle dependencies

stored - gradle install dependencies



Gradle: excluye una dependencia para una configuraciĆ³n, pero no para una configuraciĆ³n heredada (3)

Incluso me encontré con una situación similar en la que necesito excluir los frascos de chispa de incluirlos en el frasco de grasa, pero los casos de prueba requieren que se ejecuten los frascos de chispa. Así que básicamente estoy agregando dependencias de tiempo de compilación para probar classpath. así que para su problema a continuación la solución debería funcionar

configurations{ runtime.exclude group: ''log4j'' } test { classpath += configurations.compile }

Utilizando el hito de Gradle 1.0 8.

Mi proyecto usa slf4j + Logback para el registro, por lo que quiero evitar que cualquier dependencia transitiva en log4j contamine mi classpath. Así, agregué una exclusión global, así:

configurations { all*.exclude group: "log4j", module: "log4j" }

Sin embargo, estoy usando una biblioteca de prueba ( hadoop-minicluster ) que tiene una dependencia de tiempo de ejecución en log4j, por lo que ahora necesito permitir una dependencia de log4j para mi tiempo de ejecución de prueba. Intenté agregar una dependencia directa en log4j:

testRuntime group: "log4j", name: "log4j", version: "1.2.15"

y editando mi código de exclusión (un poco de un hack):

configurations.findAll {!it.name.endsWith(''testRuntime'')}.each { conf -> conf.exclude group: "log4j", module: "log4j" }

Pero esto no funciona. Al agregar la exclusión a testCompile conf también se agrega automáticamente a todas las configuraciones heredadas, incluido testRuntime. Y parece que esta exclusión anula incluso la dependencia explícita que agregué.

Parece que este es el comportamiento esperado para Gradle. De los documentos :

Si define una exclusión para una configuración particular, la dependencia transitiva excluida se filtrará para todas las dependencias al resolver esta configuración o cualquier configuración heredada .

Entonces, ¿hay alguna otra manera de hacer lo que quiero lograr?

Ideas:

  • Cree un nuevo conf myTestRuntime que no se extienda desde testCompile y utilícelo para mi classpath de prueba.
    • Pero luego tengo que duplicar todas las dependencias para testCompile y myTestRuntime.
  • Eliminar exclusiones de nivel de configuración. Para todos los confs aparte de testRuntime, recorra las dependencias y elimine manualmente log4j (o agregue una exclusión de bajo nivel en log4j).
    • ¿Es esto posible? Configuration.allDependencies es de solo lectura.

No deberías tener que definir una exclusión. A menos que reconfigures algo, la configuración testRuntime un proyecto solo se usará para la tarea de test ese proyecto.


Por ahora he logrado solucionar el problema, pero aún así agradezco cualquier solución mejor.

Esto es lo que terminé haciendo:

  • Agrega una nueva configuración solo para log4j:

    log4j(group: ''log4j'', name: ''log4j'', version: ''1.2.15'') { transitive = false }

  • Deje la exclusión de nivel de configuración para todas las configuraciones aparte de esa:

    configurations.findAll {!it.name.endsWith(''log4j'')}.each { conf -> conf.exclude group: "log4j", module: "log4j" }

  • Agregue la configuración log4j a la ruta de clase de mis pruebas:

    test { classpath += configurations.log4j }

De esta manera podemos obtener log4j.jar en la ruta de clase, aunque esté excluido de la configuración de testRuntime.