导入含@CucumberContextConfiguration的多依赖引发异常,如何解决?
方案1:拆分配置类与步骤定义包,单独指定glue路径
这是最直接的解决方式,既能保留各项目独立运行的能力,又避免依赖时的冲突:
调整A、B项目的配置类位置
将CucumberSpringConfiguration从步骤定义包(如com.projectA.core.stepdef)移到独立的配置包,比如com.projectA.cucumber.config。更新A、B项目的测试运行器
在项目A的测试启动类中,扩展@CucumberOptions的glue属性,同时包含步骤定义包和配置类包:@RunWith(Cucumber.class) @CucumberOptions( glue = {"com.projectA.core.stepdef", "com.projectA.cucumber.config"}, features = "src/test/resources/features", // 其他配置属性... ) public class ProjectATestRunner {}项目B做同样修改,确保自身运行时能扫描到配置类。
项目C的配置
项目C只需在自己的测试运行器glue中指定自身的步骤定义包+自身的CucumberSpringConfiguration所在包,无需包含A、B的配置包。此时C引入A、B的依赖时,只会加载它们的步骤定义类,不会扫描到配置类,避免冲突。
方案2:给依赖项目的配置类添加条件注解
利用Spring的条件注解,让A、B的配置类只有在没有其他@CucumberContextConfiguration类存在时才生效:
给A、B的CucumberSpringConfiguration添加@ConditionalOnMissingBean注解:
@CucumberContextConfiguration @ContextConfiguration("classpath:cucumber.xml") @ConditionalOnMissingBean(annotation = CucumberContextConfiguration.class) public class CucumberSpringConfiguration {}
这样当项目C有自己的CucumberSpringConfiguration时,A、B的配置类会被Spring自动忽略,不会触发冲突。
为什么你之前的Gradle排除方案无效?
你尝试的tasks.withType(Test)中的excludes是用来排除当前项目的测试类执行,而非移除依赖JAR中的类。Gradle无法单独排除依赖JAR中的某个类,只能排除整个依赖或模块,所以这种方法无法解决问题。
内容的提问来源于stack exchange,提问作者Yury K.

