TL;DR:两个Gradle插件使用同一依赖的不同版本,导致在调用其中一个插件时出现编译错误。
我进行了一些侦查和搜索,并且相当确定问题根源在于Serenity插件版本使用了guice 4.x,而曾经使用过guice 3.x。JAXB插件使用的是guice 3.x。
问题:
如何将插件依赖分离?我想包含两个插件,但似乎gradle会选择最高的依赖集并在所有地方使用它。
代码:
以下是build.gradle文件的相关部分。
注意:您可以通过将serenity 1.5.1插件添加到jaxb插件示例的类路径依赖项块中来复制此问题。
情况
我有一个使用Gradle 4.x编译的Java项目。
该项目依赖于两个插件:gradle-jaxb-plugin和serenity-gradle-plugin。
这两个插件共享一个依赖项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插件示例的类路径依赖项块中来复制此问题。