java google-app-engine mapreduce gradle guava

java - La exclusión de dependencias de Gradle Transitive no funciona como se esperaba.(¿Cómo me deshago de com.google.guava: guava-jdk5: 13.0?)



google-app-engine mapreduce (3)

Resulta que guava-jdk5 todavía se mantiene.

Así que cambié esto:

compile (''com.google.guava:guava:15.0''){force = true}

para esto:

compile(''com.google.guava:guava-jdk5:17.0'') { force = true }

Y eso solucionó mis problemas. Ahora puedo usar las clases del paquete ''com.google.common'' en el proyecto de Google App Engine con todas las dependencias descritas.

aquí hay un fragmento de mi build.gradle:

compile ''com.google.api-client:google-api-client:1.19.0'' compile ''com.google.apis:google-api-services-oauth2:v2-rev77-1.19.0'' compile ''com.google.apis:google-api-services-plus:v1-rev155-1.19.0'' compile ''com.google.appengine.tools:appengine-gcs-client:0.4.1'' compile ''com.google.appengine.tools:appengine-mapreduce:0.8''

que importa versiones múltiples de guayaba como se puede ver con dependencyInsight:

com.google.guava:guava:15.0 (conflict resolution) com.google.guava:guava:14.0.1 -> 15.0 +--- com.googlecode.objectify:objectify:4.1.3 | /--- default /--- net.eusashead.spring:spring-cache-gae:1.0.0.RELEASE /--- default com.google.guava:guava:[15.0,15.99] -> 15.0 +--- com.google.appengine.tools:appengine-gcs-client:0.4.1 | +--- default | +--- com.google.appengine.tools:appengine-mapreduce:0.8 | | /--- default | /--- com.google.appengine.tools:appengine-pipeline:0.2.10 | /--- com.google.appengine.tools:appengine-mapreduce:0.8 (*) +--- com.google.appengine.tools:appengine-mapreduce:0.8 (*) /--- com.google.appengine.tools:appengine-pipeline:0.2.10 (*) com.google.guava:guava-jdk5:13.0 /--- com.google.api-client:google-api-client:1.19.0 +--- default +--- com.google.apis:google-api-services-oauth2:v2-rev77-1.19.0 | /--- default +--- com.google.apis:google-api-services-plus:v1-rev155-1.19.0 | /--- default +--- com.google.appengine.tools:appengine-gcs-client:0.4.1 | +--- default | +--- com.google.appengine.tools:appengine-mapreduce:0.8 | | /--- default | /--- com.google.appengine.tools:appengine-pipeline:0.2.10 | /--- com.google.appengine.tools:appengine-mapreduce:0.8 (*) +--- com.google.api-client:google-api-client-appengine:1.17.0-rc | /--- com.google.appengine.tools:appengine-gcs-client:0.4.1 (*) +--- com.google.apis:google-api-services-storage:v1-rev1-1.18.0-rc | /--- com.google.appengine.tools:appengine-gcs-client:0.4.1 (*) +--- com.google.apis:google-api-services-bigquery:v2-rev154-1.19.0 | /--- com.google.appengine.tools:appengine-mapreduce:0.8 (*) /--- com.google.api-client:google-api-client-servlet:1.17.0-rc /--- com.google.api-client:google-api-client-appengine:1.17.0-rc (*) (*) - dependencies omitted (listed previously)

He intentado eliminar la dependencia a: haciendo:

compile (''com.google.api-client:google-api-client:1.19.0''){ exclude group: ''com.google.guava'', module: ''guava-jdk5'' } compile (''com.google.api-client:google-api-client:1.19.0''){ exclude group: ''com.google.guava'', }

pero la InsightDependencia sigue siendo la misma. También intenté

compile (''com.google.guava:guava:15.0''){force = true}

pero de nuevo la perspectiva de la dependencia sigue siendo la misma. ¿Cómo me deshago de com.google.guava: guava-jdk5: 13.0?

Detalles: he probado gradle 1.2 y 2.1 en una caja de Windows 8.1

La razón por la que intento esto es deshacerme de esta excepción:

java.lang.NoSuchMethodError: com.google.common.base.Stopwatch.createStarted()Lcom/google/common/base/Stopwatch;


Parece que una dependencia no se excluirá si hay otra dependencia en alguna parte que apunta a esa misma dependencia sin ninguna de las exclusiones.

Sin embargo, puede excluir una dependencia a través de la configuration :

configurations { all*.exclude group: ''com.google.guava'', module:''guava-jdk5'' }


Basándome en @thoutbeckers respondo debido a un caso especial, donde no pensé que su respuesta se aplicara, pero realmente lo hizo. Afortunadamente, esta respuesta puede ayudar a otros que compartieron mi problema de caso especial. Originalmente, pensé que la dependencia transitoria del mal solo era referenciada por una dependencia en el archivo build.gradle , pero en realidad era referenciada por dos dependencias. Esto se debió a que ambas dependencias, donde se hacía referencia a la mala dependencia transitiva, tenían una relación padre / hijo, pero solo noté la relación con la dependencia hija y no con la dependencia principal.

Considere el siguiente árbol de dependencias (producido por el comando gradle <my-project-name>:dependencies ):

compileClasspath - Compile classpath for source set ''main''. +--- my.org:com.my.pkg.parent:6.+ -> 6.0.4 | +--- # misc. dependencies | +--- my.org:com.my.pkg.child:6.0.4 | | +--- # misc. dependencies | | +--- other.org:bad.transitive.dependency:0.9.1 FAILED | | +--- # misc. dependencies | |--- # misc. dependencies +--- # misc. dependencies

Desde el árbol de dependencias, parece que el other.org:bad.transitive:dependency:0.9.1 solo está referenciado por una dependencia en su archivo de compilación, no dos. Sin embargo, supongamos que su archivo Gradle se ve así:

// ... misc. ... dependencies { // ... misc. dependencies ... compile ''my.org:com.my.pkg.parent:6.+'' // ... misc. dependencies ... compile (''my.org:com.my.pkg.child:6.0.4'') { exclude group: ''other.org'', module: ''bad.transitive.dependency'' }

Para un archivo Gradle como el anterior, el error persistirá aunque la dependencia transitiva que quería excluir ocurra solo en la dependencia hija, no en la dependencia principal. Sin embargo, dado que el archivo build.gradle referencia tanto a los proyectos principales como a los build.gradle , la mala dependencia transitiva debe excluirse de ambas dependencias , como se indicó anteriormente en @thoutbeckers.

Tenga en cuenta que si no desea agregar la exclusión en el nivel de configuración (como @thoutbeckers mostró en su respuesta), siempre puede excluir la dependencia transitiva de ambas dependencias a las que se hace referencia explícitamente.