使用JAR包删除Firestore数据库文档失败问题排查
解决Firestore打包JAR后抛出NoSuchMethodError的问题
这个错误的核心原因是Guava版本冲突——IntelliJ运行时会自动处理依赖优先级,拉取兼容的Guava版本,但打包成JAR时,旧版本的Guava可能被意外引入,导致找不到com.google.common.util.concurrent.MoreExecutors.directExecutor()方法(该方法在Guava 18.0及以上版本才存在)。
下面是具体的解决步骤:
1. 排查依赖冲突
首先用依赖分析工具找出项目中所有Guava的依赖实例:
- 如果你用Maven,执行命令:
mvn dependency:tree | grep guava - 如果你用Gradle,执行命令:
./gradlew dependencies | grep guava
查看输出结果,找出版本低于20.0的Guava依赖,通常是某个第三方库(比如旧版的Google API客户端)引入的。
2. 排除旧版本Guava并显式声明兼容版本
在你的构建文件中,排除冲突的旧版本Guava,同时显式添加一个与Firestore客户端兼容的Guava版本:
Maven示例(pom.xml)
<!-- 先排除Firestore依赖中自带的可能冲突的Guava --> <dependency> <groupId>com.google.cloud</groupId> <artifactId>google-cloud-firestore</artifactId> <version>你的Firestore版本</version> <exclusions> <exclusion> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </exclusion> </exclusions> </dependency> <!-- 显式声明兼容的Guava版本 --> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>32.1.3-jre</version> <!-- 建议选Firestore官方文档推荐的版本,或与你的客户端版本匹配的版本 --> </dependency>
Gradle示例(build.gradle)
dependencies { implementation('com.google.cloud:google-cloud-firestore:你的Firestore版本') { exclude group: 'com.google.guava', module: 'guava' } implementation 'com.google.guava:guava:32.1.3-jre' }
3. 检查打包配置
如果使用maven-assembly-plugin或ShadowJar插件打包,确保配置中没有错误地覆盖或合并Guava类:
- 对于ShadowJar,避免不必要的
relocate配置,或者确保依赖优先级正确; - 对于Maven Assembly,确保打包时包含的是你声明的新版本Guava,而不是旧版本。
4. 验证打包结果
解压生成的JAR包,检查lib目录(或Spring Boot项目的BOOT-INF/lib)中的Guava JAR文件,确认版本是你指定的新版本,没有旧版本残留。
完成以上步骤后,重新打包并执行java -jar xxxxx.jar,应该就能解决这个方法找不到的错误了。
内容的提问来源于stack exchange,提问作者Yagiz Ozen
相关产品推荐
相关产品推荐

