Java 如何解决与Gradle的依赖冲突?

Java 如何解决与Gradle的依赖冲突?,java,gradle,Java,Gradle,我正在用Dropwizard和Titan DB开发一个项目。两者都依赖谷歌番石榴。一个取决于版本15,另一个取决于版本18。此错误发生在运行时: ! java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.<init>()V from class com.thinkaurelius.titan.graphdb.database.idassigner.StandardID

我正在用Dropwizard和Titan DB开发一个项目。两者都依赖谷歌番石榴。一个取决于版本15,另一个取决于版本18。此错误发生在运行时:

! 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

默认情况下,当存在冲突时,Gradle将为依赖项选择最高版本。您可以强制特定版本与自定义resolutionStrategy一起使用(改编自):

这并没有增加对Guava15.0的依赖,而是说如果有依赖(甚至是过渡的)来强制使用15.0

您可以通过
gradle dependency
gradle dependencyInsight…
获得有关依赖项来源的更多信息

仅供参考,看起来您需要一些不同版本的番石榴(11.0.2、14.0.1、15.0和18.0)


HTH

如果可能的话,我不想为运行/测试构建胖罐子。我正在阅读。你能展示一下你的
build.gradle
文件吗?@fge把它放上去。我越是阅读dependency_management.html,似乎就越需要继续阅读该页面。到目前为止,我认为这是关于如何处理我发现的这个问题的最好描述:谢谢Biggay。我是从Node.js开始学习Java的,在Node.js中,npm和运行时路径解析机制使得管理可传递属性变得微不足道。有没有一种方法可以在Java中模拟这种事情?这就是所谓的着色吗?是的,着色转换了依赖项中的所有类名,这样它们就不会发生冲突(但是您可以有许多重复的类)。OSGi也有类似的目标(依赖项的运行时解析和单独的类加载器)。谢谢,我也会研究OSGi。主要的问题是复制应用程序的扩大内存占用吗?我认为使用精确声明的依赖版本运行通常比使用RAM更重要?旧的JVM过去为加载的类(PermGen)提供单独的内存空间,因此可能会耗尽内存。自从JDK8以来,这一切都不复存在了。如果在外部接口中依赖于第三方类,着色将不起作用。这将迫使API用户使用与您相同的版本。谢谢Biggay。我还没有读过关于着色的书,所以当我读的时候可能会很明显,但是为什么着色会把这个问题引入我的库呢?客户端着色也能解决这个问题吗?
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)  
    }  
}
configurations.all {
  resolutionStrategy {
    force 'com.google.guava:guava:15.0'
  }
}