2014-11-18 14 views
5

Sto sviluppando un progetto con Dropwizard e Titan DB. Entrambi dipendono da Google Guava. Un dipende versione da 15 e l'altro il 18. Questo errore si verifica in fase di esecuzione:Come posso risolvere i conflitti di dipendenza con Gradle?

! java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.<init>()V from class com.thinkaurelius.titan.graphdb.database.idassigner.StandardIDPool$ID 
BlockRunnable 

ho ricercato l'errore e found che è stato causato da Guava 15,0 dipendenza di Titano essere sfrattati da Guava 18,0.

Sono nuovo di Java e Gradle. Uso i plug-in di Gradle java e application per creare ed eseguire la classe principale con gradle run. Come posso risolvere questo problema?


Ecco il mio build.gradle:

apply plugin: 'java' 
apply plugin: 'application' 

mainClassName = "com.example.rest.App" 

repositories { 
    mavenCentral() 
} 

dependencies { 
    compile (
     [group: 'io.dropwizard', name: 'dropwizard-core', version: '0.8.0-rc1'], 
     [group: 'com.thinkaurelius.titan', name: 'titan-core', version: '0.5.1'], 
     [group: 'com.thinkaurelius.titan', name: 'titan-berkeleyje', version: '0.5.1'], 
     [group: 'com.tinkerpop', name: 'frames', version: '2.6.0'] 
    ) 
    testCompile group: 'junit', name: 'junit', version: '3.8.1' 
} 

run { 
    if (project.hasProperty("appArgs")) { 
     args Eval.me(appArgs) 
    } 
} 
+0

Preferisco non costruire giare di grasso per correre/testare, se possibile. Attualmente sto leggendo http://www.gradle.org/docs/current/userguide/dependency_management.html. –

+0

Puoi mostrare il tuo file 'build.gradle'? – fge

+0

@fge Mettilo su. Più leggo dependency_management.html, più mi sembra di aver bisogno di continuare a leggere quella pagina. –

risposta

5

Per impostazione predefinita, Gradle selezionerà la versione più alto per una dipendenza quando c'è un conflitto. È possibile forzare una versione particolare per essere utilizzato con un resolutionStrategy personalizzato (adattato da http://www.gradle.org/docs/current/dsl/org.gradle.api.artifacts.ResolutionStrategy.html):

configurations.all { 
    resolutionStrategy { 
    force 'com.google.guava:guava:15.0' 
    } 
} 

Questo non aggiunge una dipendenza da guava 15,0, ma dice che se c'è una dipendenza (anche transitivamente) per forzare l'uso di 15.0.

È possibile ottenere ulteriori informazioni sulla provenienza delle proprie dipendenze con gradle dependencies e gradle dependencyInsight ....

FYI, sembra che tu abbia richiesto diverse versioni di Guava (11.0.2, 14.0.1, 15.0 e 18.0).

HTH

+0

Grazie bigguy . Vengo su Java da Node.js, dove npm e il meccanismo di risoluzione del percorso di runtime rendono banale la gestione delle proprietà transitive. C'è un modo per emulare questo genere di cose in Java? Si chiama shading? –

+0

Sì, l'ombreggiatura trasforma tutti i nomi di classe da una dipendenza in modo che non siano in conflitto (ma è possibile quindi avere molte classi duplicate). OSGi ha obiettivi simili (risoluzione runtime delle dipendenze e classloader separati). – bigguy

+0

Grazie, esaminerà anche OSGi. La preoccupazione principale riguarda la duplicazione dell'impronta di memoria ingrandita della tua applicazione? Penso che l'esecuzione con le versioni di dichiarazione dichiarate esatte sia in genere più significativa dell'utilizzo della RAM? –

Problemi correlati