应用依赖高版本Guava与Selenium 3.0.1版本冲突,求解决方案
作为Java新手遇到这种依赖版本冲突确实挺闹心的,我给你几个不用碰复杂类加载器就能搞定的办法,按优先级推荐:
1. 优先升级Selenium版本
你的Selenium用的是3.0.1,这个版本确实和高版本Guava不兼容,但后续的Selenium 3.x版本已经修复了这个问题(比如3.141.59这个稳定版)。升级Selenium是最省心的方案,直接在你的依赖管理文件(比如Maven的pom.xml)里替换版本:
<dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>3.141.59</version> </dependency>
升级后测试一下你的Selenium代码,只要没有用到3.0.1的专属特性,基本不会有问题,同时你的应用也能正常使用Guava 23.3+。
2. 降级Guava到兼容版本
如果暂时不能升级Selenium,可以尝试把Guava降级到22.0版本(Selenium 3.0.1兼容的最高版本)。在pom.xml里直接声明Guava的依赖,覆盖传递依赖的版本:
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>22.0</version> </dependency>
注意:一定要全面测试你的应用功能,确认降级Guava后不会影响你的业务代码——毕竟你的应用原本硬依赖23.3+,得确保22.0版本包含你需要的所有API。
3. 用Shade插件隔离Guava依赖
如果前两个方案都不行(比如应用必须用23.3+,Selenium也不能升级),可以用Maven的Shade插件把你应用依赖的Guava重命名,实现依赖隔离。这样你的应用用重命名后的Guava,Selenium用它自己依赖的旧版本,互不干扰。
在pom.xml里添加Shade插件配置:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <relocations> <relocation> <pattern>com.google.common</pattern> <shadedPattern>com.myapp.google.common</shadedPattern> </relocation> </relocations> </configuration> </execution> </executions> </plugin> </plugins> </build>
执行mvn package打包后,生成的jar包会包含重命名后的Guava类,你的应用会自动使用这个隔离版本,不会和Selenium的Guava冲突。这个方法不需要修改代码,只是打包过程做了处理,对新手来说也能上手。
内容的提问来源于stack exchange,提问作者klugjo

