Java 单个项目中的多个Spring云GCP库导致NoClassDefFoundError

Java 单个项目中的多个Spring云GCP库导致NoClassDefFoundError,java,spring-boot,kotlin,google-cloud-platform,spring-cloud,Java,Spring Boot,Kotlin,Google Cloud Platform,Spring Cloud,如果我使用单个Spring云GCP库,例如实现(“org.springframework.Cloud:Spring-Cloud-GCP-starter-sql-postgresql:1.1.1.RELEASE”)和属性:Spring.Cloud.GCP.credentials.encoded key=。。。一切正常 Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org

如果我使用单个Spring云GCP库,例如
实现(“org.springframework.Cloud:Spring-Cloud-GCP-starter-sql-postgresql:1.1.1.RELEASE”)
和属性:
Spring.Cloud.GCP.credentials.encoded key=
。。。一切正常

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.autoconfigure.jdbc.DataSourceProperties]: Factory method 'cloudSqlDataSourceProperties' threw exception; nested exception is java.lang.NoClassDefFoundError: com/google/cloud/sql/core/CoreSocketFactory
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) ~[spring-beans-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:622) ~[spring-beans-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    ... 171 common frames omitted
Caused by: java.lang.NoClassDefFoundError: com/google/cloud/sql/core/CoreSocketFactory
    at org.springframework.cloud.gcp.autoconfigure.sql.GcpCloudSqlAutoConfiguration$CloudSqlDataSourcePropertiesConfiguration.cloudSqlDataSourceProperties(GcpCloudSqlAutoConfiguration.java:209) ~[spring-cloud-gcp-autoconfigure-1.1.3.RELEASE.jar:1.1.3.RELEASE]
    at org.springframework.cloud.gcp.autoconfigure.sql.GcpCloudSqlAutoConfiguration$CloudSqlDataSourcePropertiesConfiguration$$EnhancerBySpringCGLIB$$4f5495da.CGLIB$cloudSqlDataSourceProperties$0(<generated>) ~[spring-cloud-gcp-autoconfigure-1.1.3.RELEASE.jar:1.1.3.RELEASE]
    at org.springframework.cloud.gcp.autoconfigure.sql.GcpCloudSqlAutoConfiguration$CloudSqlDataSourcePropertiesConfiguration$$EnhancerBySpringCGLIB$$4f5495da$$FastClassBySpringCGLIB$$58c2377.invoke(<generated>) ~[spring-cloud-gcp-autoconfigure-1.1.3.RELEASE.jar:1.1.3.RELEASE]
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244) ~[spring-core-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:363) ~[spring-context-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.cloud.gcp.autoconfigure.sql.GcpCloudSqlAutoConfiguration$CloudSqlDataSourcePropertiesConfiguration$$EnhancerBySpringCGLIB$$4f5495da.cloudSqlDataSourceProperties(<generated>) ~[spring-cloud-gcp-autoconfigure-1.1.3.RELEASE.jar:1.1.3.RELEASE]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:567) ~[na:na]
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    ... 172 common frames omitted
Caused by: java.lang.ClassNotFoundException: com.google.cloud.sql.core.CoreSocketFactory
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583) ~[na:na]
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[na:na]
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[na:na]
    ... 183 common frames omitted
但是如果我还想通过:
实现(“org.springframework.cloud:springcloudgcpstarterpubsub:1.1.3.RELEASE”)
向我的项目添加pub/sub,那么我会得到下面的例外

我试过:

  • 使用不同的Java版本11和12
  • 不同的Spring Cloud GCP库作为“第二个”库
    实现(“org.springframework.Cloud:Spring Cloud GCP starter:1.1.3.RELEASE”)
    实现(“org.springframework.Cloud:Spring Cloud GCP starter logging:1.1.3.RELEASE”)
  • 使用
    spring.cloud.gcp.credentials.location
    而不是
    spring.cloud.gcp.credentials.encoded key
  • 使用管理服务帐户以确保它不是IAM角色问题
  • 实现(“org.springframework.cloud:spring-cloud-gcp-starter:1.1.3.RELEASE”)
    实现(“org.springframework.cloud:spring-cloud-gcp-starter-logging:1.1.3.RELEASE”)

    当我包含多个Spring Cloud GCP库时,同样的
    SocketFactory
    错误就会出现。从文档来看,它应该可以正常工作。第二个库应该只使用相同的凭据

    如果我恢复到单个库,那么它可以正常工作

    Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.autoconfigure.jdbc.DataSourceProperties]: Factory method 'cloudSqlDataSourceProperties' threw exception; nested exception is java.lang.NoClassDefFoundError: com/google/cloud/sql/core/CoreSocketFactory
        at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) ~[spring-beans-5.1.4.RELEASE.jar:5.1.4.RELEASE]
        at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:622) ~[spring-beans-5.1.4.RELEASE.jar:5.1.4.RELEASE]
        ... 171 common frames omitted
    Caused by: java.lang.NoClassDefFoundError: com/google/cloud/sql/core/CoreSocketFactory
        at org.springframework.cloud.gcp.autoconfigure.sql.GcpCloudSqlAutoConfiguration$CloudSqlDataSourcePropertiesConfiguration.cloudSqlDataSourceProperties(GcpCloudSqlAutoConfiguration.java:209) ~[spring-cloud-gcp-autoconfigure-1.1.3.RELEASE.jar:1.1.3.RELEASE]
        at org.springframework.cloud.gcp.autoconfigure.sql.GcpCloudSqlAutoConfiguration$CloudSqlDataSourcePropertiesConfiguration$$EnhancerBySpringCGLIB$$4f5495da.CGLIB$cloudSqlDataSourceProperties$0(<generated>) ~[spring-cloud-gcp-autoconfigure-1.1.3.RELEASE.jar:1.1.3.RELEASE]
        at org.springframework.cloud.gcp.autoconfigure.sql.GcpCloudSqlAutoConfiguration$CloudSqlDataSourcePropertiesConfiguration$$EnhancerBySpringCGLIB$$4f5495da$$FastClassBySpringCGLIB$$58c2377.invoke(<generated>) ~[spring-cloud-gcp-autoconfigure-1.1.3.RELEASE.jar:1.1.3.RELEASE]
        at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244) ~[spring-core-5.1.4.RELEASE.jar:5.1.4.RELEASE]
        at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:363) ~[spring-context-5.1.4.RELEASE.jar:5.1.4.RELEASE]
        at org.springframework.cloud.gcp.autoconfigure.sql.GcpCloudSqlAutoConfiguration$CloudSqlDataSourcePropertiesConfiguration$$EnhancerBySpringCGLIB$$4f5495da.cloudSqlDataSourceProperties(<generated>) ~[spring-cloud-gcp-autoconfigure-1.1.3.RELEASE.jar:1.1.3.RELEASE]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
        at java.base/java.lang.reflect.Method.invoke(Method.java:567) ~[na:na]
        at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.1.4.RELEASE.jar:5.1.4.RELEASE]
        ... 172 common frames omitted
    Caused by: java.lang.ClassNotFoundException: com.google.cloud.sql.core.CoreSocketFactory
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583) ~[na:na]
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[na:na]
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[na:na]
        ... 183 common frames omitted
    
    原因:org.springframework.beans.beans实例化异常:未能实例化[org.springframework.boot.autoconfigure.jdbc.DataSourceProperties]:工厂方法“cloudSqlDataSourceProperties”引发异常;嵌套的异常是java.lang.NoClassDefFoundError:com/google/cloud/sql/core/CoreSocketFactory
    在org.springframework.beans.factory.support.SimpleInstallationStrategy.instantiate(SimpleInstallationStrategy.java:185)~[spring-beans-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    在org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:622)~[spring-beans-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    ... 171省略了公共帧
    原因:java.lang.NoClassDefFoundError:com/google/cloud/sql/core/CoreSocketFactory
    在org.springframework.cloud.gcp.autoconfigure.sql.GcpCloudSqlAutoConfiguration$cloudSqlDataSourceProperties配置.cloudSqlDataSourceProperties(GcpCloudSqlAutoConfiguration.java:209)~[spring-cloud-gcp-autoconfigure-1.1.3.RELEASE.jar:1.1.3.RELEASE]
    在org.springframework.cloud.gcp.autoconfigure.sql.GcpCloudSqlAutoConfiguration$cloudSqlDataSourceProperties配置$$EnhancerBySpringCGLIB$$4f5495da.CGLIB$cloudSqlDataSourceProperties$0()~[spring-cloud-gcp-autoconfigure-1.1.3.RELEASE.jar:1.1.3.RELEASE]
    在org.springframework.cloud.gcp.autoconfigure.sql.GcpCloudSqlAutoConfiguration$cloudsqldatasourceproperties配置$$EnhancerBySpringCGLIB$$4f5495da$$fastclassbypringcglib$$58c2377.invoke()~[spring-cloud-gcp-autoconfigure-1.1.3.RELEASE.jar:1.1.3.RELEASE]
    在org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244)~[spring-core-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    在org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:363)~[spring-context-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    在org.springframework.cloud.gcp.autoconfigure.sql.GcpCloudSqlAutoConfiguration$cloudSqlDataSourceProperties配置$$EnhancerBySpringCGLIB$$4f5495da.cloudSqlDataSourceProperties()~[spring-cloud-gcp-autoconfigure-1.1.3.RELEASE.jar:1.1.3.RELEASE]
    在java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法)~[na:na]
    在java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)~[na:na]
    在java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)~[na:na]
    在java.base/java.lang.reflect.Method.invoke(Method.java:567)~[na:na]
    在org.springframework.beans.factory.support.SimpleInstallationStrategy.instantiate(SimpleInstallationStrategy.java:154)~[spring-beans-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    ... 省略172个公共帧
    原因:java.lang.ClassNotFoundException:com.google.cloud.sql.core.CoreSocketFactory
    在java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)~[na:na]
    在java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)~[na:na]
    在java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)~[na:na]
    ... 省略183个公共框架
    

    我还在这里创建了一个Github问题:

    由于从Maven Central复制粘贴导入而没有检查版本,所以使用了不同版本的库

    使用的版本包括
    1.1.1.RELEASE
    1.1.3.RELEASE
    。一次只能使用其中一个版本号

    重构代码以消除此错误的可能性:

    implementation("org.springframework.cloud:spring-cloud-gcp-starter-sql-postgresql:$springCloudGCPVersion")
    implementation("org.springframework.cloud:spring-cloud-gcp-starter-pubsub:$springCloudGCPVersion")
    implementation("org.springframework.cloud:spring-cloud-gcp-dependencies:$springCloudGCPVersion")
    implementation("org.springframework.cloud:spring-cloud-gcp-starter:$springCloudGCPVersion")
    

    使用BOM表也更好。事实上,当使用w/Spring引导时,它应该只导入Spring云BOM。我建议从start.spring.io生成初始项目。这将生成如下的渐变构建: