Selenium 3.10中ChromeOptions触发NoSuchMethodError的解决咨询
这个异常的核心原因很明确:com.google.common.collect.ImmutableList.toImmutableList()方法是Guava 21.0版本才新增的,而你的项目实际加载的Guava版本低于这个要求,导致Selenium调用该方法时找不到对应实现。
问题分析
你当前配置的Guava依赖用了<version>RELEASE</version>,这个标签会让Maven拉取最新的稳定版,但Maven的依赖调解机制(比如间接依赖的版本优先级、声明顺序)可能导致项目最终加载的是其他依赖引入的旧版Guava——比如你的依赖列表里的org.glassfish.jersey.bundles.repackaged:jersey-guava:jar:2.8,它内部包含了旧版Guava代码,很可能覆盖了你声明的版本。
另外,Selenium 3.10.0官方依赖的Guava版本是23.0,直接用RELEASE可能拉取到不兼容的版本(过高或过低)。
具体解决方案
以下是分步解决的方法:
指定明确的Guava版本,替代RELEASE标签
把你的Guava依赖改成Selenium 3.10.0兼容的固定版本:<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>23.0</version> </dependency>排除所有间接引入的旧版Guava
检查项目依赖树,找出所有自带Guava的依赖并排除。比如针对你依赖列表里的jersey-common,需要排除它引入的jersey-guava:<dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-common</artifactId> <version>2.8</version> <exclusions> <exclusion> <groupId>org.glassfish.jersey.bundles.repackaged</groupId> <artifactId>jersey-guava</artifactId> </exclusion> </exclusions> </dependency>你可以用Maven命令
mvn dependency:tree生成完整的依赖树,搜索guava关键词,逐个处理所有间接依赖。在dependencyManagement中锁定Guava版本
为了确保整个项目都使用指定的Guava版本,在pom.xml的<dependencyManagement>节点中添加版本锁定:<dependencyManagement> <dependencies> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>23.0</version> </dependency> </dependencies> </dependencyManagement>这会强制所有依赖(包括间接依赖)使用这个版本的Guava。
清理Maven缓存并重新构建
执行以下命令清理本地仓库的缓存依赖,避免旧版本干扰:mvn clean install -U-U参数会强制Maven更新所有依赖的快照和版本信息。
验证方法
执行完上述步骤后,你可以再次用mvn dependency:tree | grep guava命令,确认项目中只存在23.0版本的Guava,然后重新运行测试代码,应该就能解决这个异常了。
内容的提问来源于stack exchange,提问作者Shiekha Gurung

