【问题标题】:How do I resolve dependency conflicts with Gradle?如何解决与 Gradle 的依赖冲突?
【发布时间】:2014-11-18 21:59:25
【问题描述】:

我正在使用 Dropwizard 和 Titan DB 开发一个项目。两者都依赖于 Google Guava。一个依赖于版本 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

我研究了错误并found 是由泰坦的番石榴引起的 15.0 依赖被 Guava 18.0 驱逐。

我是 Java 和 Gradle 的新手。我正在使用 Gradle 的 javaapplication 插件来构建和运行带有 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)  
    }  
}

【问题讨论】:

标签: java gradle


【解决方案1】:

默认情况下,当发生冲突时,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'
  }
}

这并没有添加对 guava 15.0 的依赖,而是说明是否存在强制使用 15.0 的依赖(甚至是传递性的)。

您可以通过gradle dependenciesgradle dependencyInsight ... 获得有关依赖项来自何处的更多信息。

仅供参考,您似乎请求了几个不同版本的 Guava(11.0.2、14.0.1、15.0 和 18.0)。

HTH

【讨论】:

  • 谢谢大佬。我从 Node.js 来到 Java,npm 和运行时路径解析机制使得管理传递属性变得微不足道。有没有办法可以在 Java 中模拟这种事情?这叫阴影吗?
  • 是的,着色会转换依赖项中的所有类名,因此它们不会冲突(但您可以拥有许多重复的类)。 OSGi 有类似的目标(依赖项的运行时解析和单独的类加载器)。
  • 谢谢,也会研究 OSGi。复制的主要问题是应用程序扩大的内存占用吗?我认为使用确切声明的依赖版本运行通常比 RAM 使用更重要?
  • 旧的 JVM 曾经为加载的类 (PermGen) 提供单独的内存空间,因此您可能会耗尽内存。从 JDK8 开始,这已经不复存在了。如果您在外部接口中依赖第三方类,则着色将不起作用。这将迫使您 API 的用户使用与您相同的版本。
  • 谢谢大佬。我还没有读过关于着色的文章,所以当我读到的时候可能会很明显,但是为什么着色会在我的库中引入这个问题呢?这也可以通过客户端着色来解决吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-13
  • 1970-01-01
  • 1970-01-01
  • 2019-01-01
  • 1970-01-01
相关资源
最近更新 更多