2016-07-26 67 views
0

在我的项目中,jersey-core从许多依赖项中拉取。我不知道哪一个。我相信这并不重要,因为我认为如果多个依赖关系拉同一个,那么gradle总是会采用更高的版本。我错了。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和方法getContextClassLoaderPA()不存在ReflectionHelper 1.1

我怎么能强迫gradle这个总是拿更高版本?

我使用intellij。

+0

不确定正确的语法,但通常你会通过手动排除传递依赖关系来做类似的事情。 https://docs.gradle.org/current/userguide/dependency_management.html#sub:exclude_transitive_dependencies –

回答

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应替换为您希望检查的配置名称(如compile)。这会给你一个关于哪些版本被哪些依赖关系拉入的图表。

+0

'force'就够了,不需要'forcedModules'。谢谢。 –