解决Gradle插件依赖冲突

5
TL;DR:两个Gradle插件使用同一依赖的不同版本,导致在调用其中一个插件时出现编译错误。

情况

  1. 我有一个使用Gradle 4.x编译的Java项目。

  2. 该项目依赖于两个插件:gradle-jaxb-pluginserenity-gradle-plugin

  3. 这两个插件共享一个依赖项guice

问题

我需要升级其中一个插件(serenety)。升级会在调用jaxb插件时导致冲突。

...
Caused by: java.lang.NoClassDefFoundError: com/google/inject/internal/util/$Maps
        at com.google.inject.assistedinject.BindingCollector.<init>(BindingCollector.java:34)
        at com.google.inject.assistedinject.FactoryModuleBuilder.<init>(FactoryModuleBuilder.java:206)
        at org.openrepose.gradle.plugins.jaxb.schema.guice.DocSlurperModule.configure(DocSlurperModule.groovy:43)
...

我进行了一些侦查和搜索,并且相当确定问题根源在于Serenity插件版本使用了guice 4.x,而曾经使用过guice 3.x。JAXB插件使用的是guice 3.x。
问题:
如何将插件依赖分离?我想包含两个插件,但似乎gradle会选择最高的依赖集并在所有地方使用它。
代码:
以下是build.gradle文件的相关部分。
buildscript {
    repositories {
        mavenCentral()
        maven { url 'https://plugins.gradle.org/m2/' }
    }
    dependencies {
        classpath 'gradle.plugin.org.openrepose:gradle-jaxb-plugin:2.4.1'
        classpath 'net.serenity-bdd:serenity-gradle-plugin:1.5.1'
    }
}
...
project(':integration-tests') {
    apply plugin: 'java'
    apply plugin: 'net.serenity-bdd.aggregator'
    ...
}
...
project(':cms-business-model') {
    apply plugin: 'org.openrepose.gradle.plugins.jaxb'
    apply plugin: 'java'
    ...
}

注意:您可以通过将serenity 1.5.1插件添加到jaxb插件示例的类路径依赖项块中来复制此问题。
1个回答

4
TL;DR: 当Gradle插件共享一个依赖项但使用不同版本的依赖项时,只有最高版本实际上被使用。您必须明确地排除更高版本的依赖项。
这里的冲突是因为jaxb插件依赖于guice:3.0和guice-assistedinject:3.0。
当serenity使用guice:4.0时,guice:4.0和guice-assistedinject:3.0之间存在版本不匹配问题。
解决方案是从serenity中排除guice依赖项,因此回退到guice:3.0。
更新后的代码:
buildscript {
    repositories {
        mavenCentral()
        maven { url 'https://plugins.gradle.org/m2/' }
    }
    dependencies {
        classpath 'gradle.plugin.org.openrepose:gradle-jaxb-plugin:2.4.1'
        classpath ('net.serenity-bdd:serenity-gradle-plugin:1.5.1') {
            exclude group: 'com.google.inject', module:'guice'
        }
    }
}
...

备选解决方案

另一种可能的解决方案是要求使用guice-assistedinject:4.0,但由于上述方法有效,我没有继续探索。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接