guava在jdk7和jdk8之间的兼容问题

Google Guava 非常流行,即使你不直接引用它,也可能由其它jar间接引用:

1
2
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>

简记遇到的一个关于guava在jdk7和jdk8之间切换的冲突和兼容问题。

jdk8的工程,引用别人jdk7环境的一个jar之后(下面以jdk7-jar代称),下述代码直接抛错,

1
new WebDriverWait(driver, timeout).until(ExpectedConditions.presenceOfElementLocated(by));

表面上看是selenium-support的jar包冲突,把这个jar包exclusion后仍有错误,经查,jdk7-jar中并没有引用这个jar。

仔细去翻代码,until(Function<? super T, V> isTrue),需要的参数类型是Function(jdk8的类),而
ExpectedConditions.presenceOfElementLocated(by)的返回类型ExpectedCondition<WebElement>的父类是Function<WebDriver, T>,这是guava的类public interface Function<F, T> {,该guava的jar版本很低,对比去掉jdk7-jar之后自动引用的高版本guava,public interface Function<F, T> extends java.util.function.Function<F, T> {,其中java.util.function.Function是jdk8的类,到此,问题解决并且背后原因明了,

把jdk7-jar之中间接引用的guava包exclusion掉。

jdk7环境下必须用低版本的guava包,因为高版本的guava继承了jdk8的类。在jdk7和8之间迁移jar时可以留意一下guava冲突问题。