Java11 Maven项目中io.appium与io.grpc依赖冲突解决问询
问题
我正在开发一个基于Java 11的Maven项目,该项目使用Appium进行Android测试,并通过gRPC实现与其他设备的通信。
Appium依赖配置
<!-- https://mvnrepository.com/artifact/io.appium/java-client --> <dependency> <groupId>io.appium</groupId> <artifactId>java-client</artifactId> <version>8.3.0</version> </dependency>
gRPC依赖配置
<dependency> <groupId>io.grpc</groupId> <artifactId>grpc-netty-shaded</artifactId> <version>1.53.0</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-protobuf</artifactId> <version>1.53.0</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-stub</artifactId> <version>1.53.0</version> </dependency>
运行错误信息
Warning: [org.testng.ITest] implementation on class [com.framework.DynamicTest] returned null. Defaulting to method name java.lang.NoSuchMethodError: com.google.common.collect.ImmutableMap.toImmutableMap(Ljava/util/function/Function;Ljava/util/function/Function;)Ljava/util/stream/Collector; at io.appium.java_client.remote.AppiumNewSessionCommandPayload.makeW3CSafe(AppiumNewSessionCommandPayload.java:40) at io.appium.java_client.remote.AppiumNewSessionCommandPayload.<init>(AppiumNewSessionCommandPayload.java:54) at io.appium.java_client.AppiumDriver.startSession(AppiumDriver.java:229) at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:157) at io.appium.java_client.AppiumDriver.<init>(AppiumDriver.java:80) at io.appium.java_client.AppiumDriver.<init>(AppiumDriver.java:92) at io.appium.java_client.android.AndroidDriver.<init>(AndroidDriver.java:117)
错误发生在执行以下代码行时:
mobileDriver = new AndroidDriver(new URL(strURL), capabilities);
移除gRPC依赖后程序即可正常运行,请问是否存在让io.appium与io.grpc共存的解决方案?
解决方案
这个错误是Guava版本冲突导致的:Appium Java Client 8.3.0依赖的Guava版本和gRPC 1.53.0依赖的Guava版本不一致,ImmutableMap.toImmutableMap方法在低版本Guava中不存在,gRPC引入的旧版本Guava覆盖了Appium需要的新版本,从而引发NoSuchMethodError。
以下是可行的解决办法:
1. 统一Guava版本,强制使用兼容的高版本
在Maven的dependencyManagement中声明一个足够高的Guava版本,确保Appium和gRPC都能兼容。Appium 8.3.0要求Guava版本至少是31.1-jre,而gRPC 1.53.0也能兼容这个版本。
在pom.xml中添加:
<dependencyManagement> <dependencies> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>31.1-jre</version> </dependency> </dependencies> </dependencyManagement>
2. 排除gRPC依赖中的旧版Guava
如果不想全局统一版本,可以在每个gRPC依赖中排除自带的Guava,让项目使用Appium依赖的新版本:
<dependency> <groupId>io.grpc</groupId> <artifactId>grpc-netty-shaded</artifactId> <version>1.53.0</version> <exclusions> <exclusion> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-protobuf</artifactId> <version>1.53.0</version> <exclusions> <exclusion> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-stub</artifactId> <version>1.53.0</version> <exclusions> <exclusion> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </exclusion> </exclusions> </dependency>
3. 更新gRPC到更高兼容版本
gRPC 1.53.0是较旧的版本,更新到更高版本(比如1.60.0+),这些版本依赖的Guava版本会和Appium 8.3.0的要求更匹配,减少冲突概率。
内容的提问来源于stack exchange,提问作者jon_17z
相关产品推荐
相关产品推荐

