Несколько библиотек Spring Cloud GCP в одном проекте вызывают NoClassDefFoundError - PullRequest
0 голосов
/ 30 сентября 2019

Если я использую одну библиотеку Spring Cloud GCP, например, implementation("org.springframework.cloud:spring-cloud-gcp-starter-sql-postgresql:1.1.1.RELEASE") и свойство: spring.cloud.gcp.credentials.encoded-key= для учетных данных ... все работает нормально.

Но если я также хочу сказать, добавьте pub / sub кмой проект через: implementation("org.springframework.cloud:spring-cloud-gcp-starter-pubsub:1.1.3.RELEASE"), тогда я получаю исключение ниже.

Я пробовал:

  1. Использование разных версий Java 11 и 12
  2. Различное Spring GCP GCPбиблиотеки как «вторая» библиотека implementation("org.springframework.cloud:spring-cloud-gcp-starter:1.1.3.RELEASE") и implementation("org.springframework.cloud:spring-cloud-gcp-starter-logging:1.1.3.RELEASE")
  3. Использование spring.cloud.gcp.credentials.location вместо spring.cloud.gcp.credentials.encoded-key
  4. Используйте учетную запись службы администратора, чтобы убедиться, что это не проблема роли IAM.

implementation("org.springframework.cloud:spring-cloud-gcp-starter:1.1.3.RELEASE") и implementation("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

Я также создал здесь проблему Github: https://github.com/spring-cloud/spring-cloud-gcp/issues/1948

1 Ответ

0 голосов
/ 30 сентября 2019

Различные версии библиотек использовались из-за импорта копией-вставки из 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")
...