You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 12:15:01