Spring环境实例化RemoteWebDriver遇OpenTelemetry依赖冲突报错
问题根源
这个错误是Spring引入的OpenTelemetry依赖和Selenium内置的OpenTelemetry版本不兼容导致的。Spring(尤其是Spring Boot)默认会引入OpenTelemetry的自动配置组件,而Selenium内部也集成了OpenTelemetry用于链路追踪。当两者版本不一致时,JVM加载的io.opentelemetry.sdk.autoconfigure.spi.traces.SdkTracerProviderConfigurer接口来自Spring的依赖包,而Selenium的org.openqa.selenium.remote.tracing.opentelemetry.SeleniumSpanExporter实现的是自己包内的同名称接口(类加载器会把不同版本的同名称接口视为不同类型),最终触发ServiceConfigurationError。
无Spring的项目里没有额外的OpenTelemetry依赖,只加载Selenium自带的版本,所以不会出现冲突。
解决方案
方案1:排除Spring中的OpenTelemetry依赖
在你的Maven或Gradle配置中,排除Spring自动引入的OpenTelemetry相关依赖,让项目仅使用Selenium自带的版本:
Maven示例(pom.xml)
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <exclusions> <exclusion> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-sdk-autoconfigure</artifactId> </exclusion> <exclusion> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-sdk-trace</artifactId> </exclusion> <!-- 若还有其他opentelemetry相关依赖,一并排除 --> </exclusions> </dependency>
Gradle示例(build.gradle)
implementation('org.springframework.boot:spring-boot-starter') { exclude group: 'io.opentelemetry', module: 'opentelemetry-sdk-autoconfigure' exclude group: 'io.opentelemetry', module: 'opentelemetry-sdk-trace' }
方案2:统一OpenTelemetry版本
先通过依赖树查询Selenium使用的OpenTelemetry版本:
# Maven mvn dependency:tree | grep opentelemetry # Gradle ./gradlew dependencies | grep opentelemetry
然后在项目中强制统一该版本,确保Spring和Selenium使用同一套OpenTelemetry组件:
Maven示例
<properties> <!-- 替换成你查到的Selenium对应的OpenTelemetry版本 --> <opentelemetry.version>1.28.0</opentelemetry.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-bom</artifactId> <version>${opentelemetry.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
方案3:禁用Spring的OpenTelemetry自动配置
如果你的项目不需要Spring的OpenTelemetry自动配置,可以直接在启动类中排除对应的自动配置类:
@SpringBootApplication(exclude = {OpenTelemetryAutoConfiguration.class}) public class YourSeleniumTestApplication { public static void main(String[] args) { SpringApplication.run(YourSeleniumTestApplication.class, args); } }
内容的提问来源于stack exchange,提问作者Alex Smoke

