2014-11-18 4 views
5

Я разрабатываю проект с Dropwizard и Titan DB. Оба зависят от Google Guava. Один зависит от версии 15, а другой на 18. Эта ошибка возникает во время выполнения:Как разрешить конфликты зависимостей с 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 

Я исследовал ошибку и found, что она была вызвана гуавы 15.0 зависимость Титана выселяют от гуавы 18,0.

Я новичок в Java и Gradle. Я использую плагины Gradle java и application для создания и запуска основного класса с gradle run. Как я могу решить эту проблему?


Вот мой 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

Я бы предпочел не строить жирные банки для работы/тестирования, если это возможно. В настоящее время я читаю http://www.gradle.org/docs/current/userguide/dependency_management.html. –

+0

Можете ли вы показать свой файл 'build.gradle'? – fge

+0

@fge Просто поставьте это. Чем больше я читаю dependency_management.html, тем больше мне кажется, что мне нужно продолжать читать эту страницу. –

ответ

5

По умолчанию Gradle будет выбрать самую высокую версию для зависимости, когда возникает конфликт. Вы можете заставить определенную версию для использования с пользовательским resolutionStrategy (адаптировано из http://www.gradle.org/docs/current/dsl/org.gradle.api.artifacts.ResolutionStrategy.html):

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

Это не добавляет зависимость от гуавы 15.0, но говорит, что если существует зависимость (даже транзитивно), чтобы заставить использование 15,0.

Вы можете получить более подробную информацию о том, где ваши зависимости: gradle dependencies и gradle dependencyInsight ....

FYI, похоже, что у вас есть несколько разных версий запросов Guava (11.0.2, 14.0.1, 15.0 и 18.0).

HTH

+0

Спасибо bigguy , Я прихожу на Java из Node.js, где npm и механизм разрешения пути времени выполнения делают управление транзитивными свойствами тривиальными. Есть ли способ, которым я могу эмулировать подобные вещи на Java? Это называется затенением? –

+0

Да, затенение преобразует все имена классов из зависимости, чтобы они не конфликтуют (но тогда у вас может быть много повторяющихся классов). OSGi имеет схожие цели (разрешение времени выполнения зависимостей и отдельные загрузчики классов). – bigguy

+0

Спасибо, посмотрю в OSGi тоже. Является ли главная проблема дублированием увеличенного объема памяти вашего приложения? Я думаю, что работа с точными заявленными версиями зависимостей обычно более значительна, чем использование ОЗУ? –