通过JDBC连接Google Cloud实例时遇NoSuchMethodError问题求助
这个错误java.lang.NoSuchMethodError: 'com.google.api.client.json.JsonParser com.google.api.client.json.JsonFactory.createJsonParser(java.io.InputStream, java.nio.charset.Charset)'本质是依赖版本冲突导致的——运行时环境里的Google JSON客户端库版本,和Cloud SQL Socket Factory依赖的库版本不兼容,找不到对应的方法签名。
核心原因
Cloud SQL的Socket Factory依赖google-auth-library-oauth2-http和google-api-client等库处理身份验证,如果你的项目里同时引入了不同版本的这些库,就会出现方法不匹配的问题。比如旧版本的JsonFactory没有带Charset参数的createJsonParser方法,而Socket Factory需要这个版本的方法。
具体解决步骤
统一Google Cloud依赖版本
最稳妥的方式是用Google Cloud的BOM(物料清单)来管理所有相关依赖的版本,它会自动保证所有Google Cloud库的兼容性。- 如果用Maven,在
pom.xml的dependencyManagement里加入:<dependencyManagement> <dependencies> <dependency> <groupId>com.google.cloud</groupId> <artifactId>libraries-bom</artifactId> <version>26.42.0</version> <!-- 可替换为最新稳定版 --> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> - 然后引入Postgres Socket Factory时不用指定版本:
<dependency> <groupId>com.google.cloud.sql</groupId> <artifactId>postgres-socket-factory</artifactId> </dependency> - 如果用Gradle,在
build.gradle里加入:implementation platform('com.google.cloud:libraries-bom:26.42.0') implementation 'com.google.cloud.sql:postgres-socket-factory'
- 如果用Maven,在
排查并排除冲突依赖
用依赖分析工具找出冲突的库:- Maven执行:
mvn dependency:tree - Gradle执行:
./gradlew dependencies
查找输出中是否有多个版本的google-api-client、google-auth-library-oauth2-http或google-http-client,如果有,排除掉旧版本的依赖。比如在Maven里排除:
<dependency> <groupId>某个第三方库</groupId> <artifactId>xxx</artifactId> <exclusions> <exclusion> <groupId>com.google.api-client</groupId> <artifactId>google-api-client</artifactId> </exclusion> </exclusions> </dependency>- Maven执行:
清理缓存并重新构建
清理项目的依赖缓存,确保旧版本的库被移除:- Maven:
mvn clean install - Gradle:
./gradlew clean build
- Maven:
代码验证
你的JDBC连接代码本身是正确的,只要确保连接字符串里的<...:database>是正确的实例连接名(格式为项目ID:区域:实例名称),用户名和密码无误即可。
内容的提问来源于stack exchange,提问作者CodeMonkey

