Spring Boot集成BigQuery遇ManagedChannelImplBuilder依赖缺失问题
我正在用Spring Boot应用对接BigQuery与Google Cloud SQL,添加gson依赖后出现运行时错误,报错信息如下:
org.springframework.beans.factory.UnsatisfiedDependencyException:
Error creating bean with name 'annotationDAO': Unsatisfied dependency
expressed through field 'bigQueryRepository'; nested exception is
org.springframework.beans.factory.BeanCreationException: Error
creating bean with name 'bigQueryRepository' defined in URL
[jar:file:/statistics-service.jar!/BOOT-INF/classes!/com/stl/sciocardio/webapp/statistics/repository/BigQueryRepository.class]:
Instantiation of bean failed; nested exception is
org.springframework.beans.BeanInstantiationException: Failed to
instantiate
[com.stl.sciocardio.webapp.statistics.repository.BigQueryRepository]:
Constructor threw exception; nested exception is
java.lang.NoClassDefFoundError:
io/grpc/internal/ManagedChannelImplBuilder$ChannelBuilderDefaultPortProvider
pom.xml部分配置如下:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> <version>1.5.4.RELEASE</version> </dependency> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-coyote</artifactId> <version>7.0.14</version> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.3.1</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.13</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>com.vaadin.external.google</groupId> <artifactId>android-json</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.google.cloud</groupId> <artifactId>google-cloud-datastore</artifactId> <version>1.97.0</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency> <dependency> <groupId>com.github.stefanbirkner</groupId> <artifactId>system-rules</artifactId> <version>1.19.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-inline</artifactId> <version>4.3.1</version> <scope>test</scope> </dependency> <dependency> <groupId>com.google.cloud</groupId> <artifactId>google-cloud-bigquery</artifactId> <version>2.16.1</version> <exclusions> <exclusion> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.google.cloud</groupId> <artifactId>google-cloud-bigquerystorage</artifactId> <version>2.21.0</version> <exclusions> <exclusion> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>31.1-jre</version> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.10</version> <exclusions> <exclusion> <groupId>*</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>io.netty</groupId> <artifactId>netty-transport-native-kqueue</artifactId> <version>${project.version}</version> </dependency> </dependencies> </dependencyManagement>
我认为这是依赖问题,因为添加gson库后才出现该错误,使用Maven 3,请问有什么解决思路?
- 排查grpc依赖冲突:报错提示的缺失类属于
grpc-core包,添加gson后可能间接引入了不兼容的grpc版本,和Google Cloud客户端依赖的版本冲突。执行mvn dependency:tree命令查看grpc相关依赖的版本来源,找到冲突项后,要么通过依赖排除移除冲突版本,要么显式指定兼容的grpc-core版本,比如:
<dependency> <groupId>io.grpc</groupId> <artifactId>grpc-core</artifactId> <version>1.54.0</version> <!-- 选择与Google Cloud客户端匹配的版本 --> </dependency>
移除gson的全量排除配置:gson本身没有强制的传递依赖,你添加的
<exclusion><groupId>*</groupId><artifactId>*</artifactId></exclusion>完全没必要,反而可能打乱依赖传递链,直接删除这个排除块即可。升级Spring Boot版本:当前使用的Spring Boot 1.5.4.RELEASE是2017年的老旧版本,和你用的Google Cloud客户端、guava 31.1-jre等高版本依赖兼容性极差。建议升级到Spring Boot 2.x的稳定版本(如2.7.x),同时同步调整spring-cloud-dependencies的版本,从根源减少依赖冲突。
验证guava版本兼容性:你手动指定了guava 31.1-jre,但Google Cloud客户端对guava版本有特定要求,这个版本可能和grpc或其他组件不兼容。可以尝试去掉Google Cloud依赖中的guava排除,让依赖自带的guava版本生效,或者确认当前guava版本与所有相关组件的兼容性。
清理Maven缓存并重新构建:执行
mvn clean install -U命令,强制更新依赖并清理本地缓存的损坏文件,重新构建项目。
内容的提问来源于stack exchange,提问作者sachith

