Selenium 4升级后UberJar包运行时Firefox Driver加载失败如何解决
问题根因
Selenium 4 依赖SPI(服务提供接口)机制加载各浏览器驱动的执行器实现。打包UberJar时如果未对多依赖下META-INF/services目录中的SPI配置文件做合并处理,不同依赖的同路径配置文件会互相覆盖,导致Selenium无法识别FirefoxDriver的实现类,触发Optional.orElseThrow空值异常。
单元测试运行时所有依赖分别加载,不会出现配置覆盖问题,因此测试用例可正常执行。
修复方案
基于Maven maven-shade-plugin 打包
在shade插件的转换配置中添加ServicesResourceTransformer,自动合并所有SPI服务配置文件:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.5.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <!-- 合并SPI服务配置 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> <!-- 其他已有transformer配置保持不变 --> </transformers> </configuration> </execution> </executions> </plugin>
基于Gradle Shadow 插件打包
在shadowJar配置块中启用服务文件合并能力:
shadowJar { // 合并所有META-INF/services下的配置文件 mergeServiceFiles() // 其他原有配置保持不变 }
验证方式
打包完成后解压生成的UberJar文件,检查META-INF/services/org.openqa.selenium.remote.service.DriverService$Builder文件,确认其中存在org.openqa.selenium.firefox.GeckoDriverService$Builder条目,即说明配置合并生效,问题已修复。
内容的提问来源于stack exchange,提问作者Phyxx
相关产品推荐
相关产品推荐

