Gradle拉依赖关系时版本冲突

时间:2016-07-26 12:33:02

标签: java intellij-idea gradle jersey

在我的项目中,jersey-core来自许多依赖项。我不知道从哪些人那里。我认为这没关系,因为我认为如果多个依赖关系拉同一个,那么gradle将总是采用更高版本。我错了。

[ERROR] [main] [n/a] org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - StandardWrapper.Throwable
java.lang.NoSuchMethodError: com.sun.jersey.core.reflection.ReflectionHelper.getContextClassLoaderPA()Ljava/security/PrivilegedAction;
    at com.sun.jersey.spi.scanning.AnnotationScannerListener.<init>(AnnotationScannerListener.java:94) ~[jersey-server-1.19.jar:1.19]

AnnotationScannerListener是1.19,ReflectionHelper是1.1,而ReflectionHelper 1.1中不存在方法getContextClassLoaderPA()

如何强制gradle始终使用更高版本?

我使用intellij。

1 个答案:

答案 0 :(得分:1)

默认情况下,gradle应该将最高版本的依赖项添加到类路径中。

您可以强制将依赖项的版本设置为特定版本,如下所示:

configurations.all {
  resolutionStrategy {

    // force certain versions of dependencies (including transitive)
    //  *append new forced modules:
    force 'asm:asm-all:3.3.1', 'commons-io:commons-io:1.4'
  }
}

此示例直接取自https://docs.gradle.org/current/dsl/org.gradle.api.artifacts.ResolutionStrategy.html,可能值得一读,以及https://docs.gradle.org/current/userguide/dependency_management.html

另一条建议是,如果你想了解什么是相互冲突的罐子,你可以做到以下几点:

gradle dependencyInsight --dependency $dependencyName --configuration $configurationName

其中$dependencyName应替换您的依赖项名称(例如asm-all),而$configurationName应替换为您要检查的配置名称(例如{ {1}})。这将为您提供由哪些依赖项引入的版本的图表。