Развертывание приложения Spring Boot в Google App Engine - проблемы с подключением к экземпляру SQL (PostgreSQL) - PullRequest
0 голосов
/ 27 мая 2020

У меня есть приложение Spring Boot на основе Gradle, которое я пытаюсь развернуть в App Engine через плагин Gradle App Engine. Экземпляр SQL (PostgreSQL) настроен и работает нормально, я могу подключиться к нему локально через DataGrip, и он отлично работает. Вот мой файл application.properties:

spring.datasource.username=username
spring.datasource.password=password

spring.jpa.hibernate.ddl-auto=create

spring.jpa.show-sql=true

#################### GOOGLE CLOUD SETTINGS
spring.cloud.gcp.sql.enabled=true
spring.cloud.gcp.sql.database-name=db-name
spring.cloud.gcp.sql.instance-connection-name=app-name:europe-west2:db-name

Когда я пытаюсь развернуть приложение, я получаю следующую ошибку (кажется, что он не может подключиться к экземпляру SQL):

A 2020-05-27T16:12:26.340839Z 2020-05-27 16:12:26.340  INFO 10 --- [           main] o.s.c.g.a.s.GcpCloudSqlAutoConfiguration : Default POSTGRESQL JdbcUrl provider. Connecting to jdbc:postgresql://google/db-name?socketFactory=com.google.cloud.sql.postgres.SocketFactory&cloudSqlInstance=instance-name:europe-west2:db-name with driver org.postgresql.Driver 
A 2020-05-27T16:12:26.773138Z 2020-05-27 16:12:26.772  INFO 10 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default] 
A 2020-05-27T16:12:26.977687Z 2020-05-27 16:12:26.977  INFO 10 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate ORM core version 5.4.15.Final 
A 2020-05-27T16:12:27.413333Z 2020-05-27 16:12:27.413  INFO 10 --- [           main] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.1.0.Final} 
A 2020-05-27T16:12:27.683594Z 2020-05-27 16:12:27.683  INFO 10 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting... 
A 2020-05-27T16:12:27.760810Z 2020-05-27 16:12:27.760  INFO 10 --- [           main] c.g.cloud.sql.core.CoreSocketFactory     : Connecting to Cloud SQL instance [app-name:europe-west2:db-name] via unix socket. 
A 2020-05-27T16:12:27.966435Z 2020-05-27 16:12:27.966  WARN 10 --- [           main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is java.lang.IncompatibleClassChangeError: Found interface org.objectweb.asm.ClassVisitor, but class was expected 
2020-05-27 17:12:27.970 BST
2020-05-27 16:12:27.970 INFO 10 --- [ main] o.apache.catalina.core.StandardService : Stopping service [Tomcat]

Я исследовал эту проблему, и кажется, что это происходит, когда путь к классам времени выполнения отличается от пути к классам компиляции. Проблема в том, что я не могу воспроизвести его локально и не могу понять, является ли это причиной зависимости.

Полная трассировка стека:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is java.lang.IncompatibleClassChangeError: Found interface org.objectweb.asm.ClassVisitor, but class was expected

        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean (AbstractAutowireCapableBeanFactory.java:1796)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:595)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:517)
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0 (AbstractBeanFactory.java:323)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:226)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:321)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:202)
        at org.springframework.context.support.AbstractApplicationContext.getBean (AbstractApplicationContext.java:1108)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization (AbstractApplicationContext.java:868)
        at org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:550)
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh (ServletWebServerApplicationContext.java:141)
        at org.springframework.boot.SpringApplication.refresh (SpringApplication.java:747)
        at org.springframework.boot.SpringApplication.refreshContext (SpringApplication.java:397)
        at org.springframework.boot.SpringApplication.run (SpringApplication.java:315)
        at org.springframework.boot.SpringApplication.run (SpringApplication.java:1226)
        at org.springframework.boot.SpringApplication.run (SpringApplication.java:1215)
        at com.turbochargedapps.basketballappinternalrest.BasketballAppInternalRestApplication.main (BasketballAppInternalRestApplication.java:21)
        at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
        at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
        at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke (Method.java:566)
        at org.springframework.boot.loader.MainMethodRunner.run (MainMethodRunner.java:48)
        at org.springframework.boot.loader.Launcher.launch (Launcher.java:87)
        at org.springframework.boot.loader.Launcher.launch (Launcher.java:51)
        at org.springframework.boot.loader.JarLauncher.main (JarLauncher.java:52)

Caused by: java.lang.IncompatibleClassChangeError: Found interface org.objectweb.asm.ClassVisitor, but class was expected

        at jnr.ffi.provider.jffi.AsmLibraryLoader.generateInterfaceImpl (AsmLibraryLoader.java:104)
        at jnr.ffi.provider.jffi.AsmLibraryLoader.loadLibrary (AsmLibraryLoader.java:89)
        at jnr.ffi.provider.jffi.NativeLibraryLoader.loadLibrary (NativeLibraryLoader.java:44)
        at jnr.ffi.LibraryLoader.load (LibraryLoader.java:325)
        at jnr.unixsocket.Native.<clinit> (Native.java:80)
        at jnr.unixsocket.UnixSocketChannel.<init> (UnixSocketChannel.java:101)
        at jnr.unixsocket.UnixSocketChannel.open (UnixSocketChannel.java:65)
        at com.google.cloud.sql.core.CoreSocketFactory.connect (CoreSocketFactory.java:180)
        at com.google.cloud.sql.postgres.SocketFactory.createSocket (SocketFactory.java:71)
        at org.postgresql.core.PGStream.<init> (PGStream.java:73)
        at org.postgresql.core.v3.ConnectionFactoryImpl.tryConnect (ConnectionFactoryImpl.java:93)
        at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl (ConnectionFactoryImpl.java:197)
        at org.postgresql.core.ConnectionFactory.openConnection (ConnectionFactory.java:49)
        at org.postgresql.jdbc.PgConnection.<init> (PgConnection.java:211)
        at org.postgresql.Driver.makeConnection (Driver.java:459)
        at org.postgresql.Driver.connect (Driver.java:261)
        at com.zaxxer.hikari.util.DriverDataSource.getConnection (DriverDataSource.java:138)
        at com.zaxxer.hikari.pool.PoolBase.newConnection (PoolBase.java:358)
        at com.zaxxer.hikari.pool.PoolBase.newPoolEntry (PoolBase.java:206)
        at com.zaxxer.hikari.pool.HikariPool.createPoolEntry (HikariPool.java:477)
        at com.zaxxer.hikari.pool.HikariPool.checkFailFast (HikariPool.java:560)
        at com.zaxxer.hikari.pool.HikariPool.<init> (HikariPool.java:115)
        at com.zaxxer.hikari.HikariDataSource.getConnection (HikariDataSource.java:112)
        at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection (DatasourceConnectionProviderImpl.java:122)
        at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection (JdbcEnvironmentInitiator.java:180)
        at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService (JdbcEnvironmentInitiator.java:68)
        at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService (JdbcEnvironmentInitiator.java:35)
        at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService (StandardServiceRegistryImpl.java:101)
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService (AbstractServiceRegistryImpl.java:263)
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService (AbstractServiceRegistryImpl.java:237)
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService (AbstractServiceRegistryImpl.java:214)
        at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.injectServices (DefaultIdentifierGeneratorFactory.java:152)
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.injectDependencies (AbstractServiceRegistryImpl.java:286)
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService (AbstractServiceRegistryImpl.java:243)
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService (AbstractServiceRegistryImpl.java:214)
        at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.<init> (InFlightMetadataCollectorImpl.java:176)
        at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete (MetadataBuildingProcess.java:118)
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata (EntityManagerFactoryBuilderImpl.java:1214)
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build (EntityManagerFactoryBuilderImpl.java:1245)
        at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory (SpringHibernateJpaPersistenceProvider.java:58)
        at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory (LocalContainerEntityManagerFactoryBean.java:365)
        at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory (AbstractEntityManagerFactoryBean.java:391)
        at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet (AbstractEntityManagerFactoryBean.java:378)
        at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet (LocalContainerEntityManagerFactoryBean.java:341)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods (AbstractAutowireCapableBeanFactory.java:1855)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean (AbstractAutowireCapableBeanFactory.java:1792)

файл build.gradle:

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.google.cloud.tools:appengine-gradle-plugin:2.2.0'
    }
}

plugins {
    id 'org.springframework.boot' version '2.2.7.RELEASE'
    id 'io.spring.dependency-management' version '1.0.9.RELEASE'
    id 'org.asciidoctor.convert' version '1.5.8'
    id 'java'
}

apply plugin: 'com.google.cloud.tools.appengine'

appengine {
    deploy {
        appengine.deploy.version = "GCLOUD_CONFIG"
        appengine.deploy.projectId = "GCLOUD_CONFIG"
    }
}

group = 'com.group'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
    mavenCentral()
}

ext {
    set('snippetsDir', file("build/generated-snippets"))
    set('springCloudVersion', "Hoxton.SR4")
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    compile project(':project-core-submodule')
    compile group: 'com.jayway.jsonpath', name: 'json-path', version: '2.0.0'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
    testImplementation 'org.springframework.restdocs:spring-restdocs-mockmvc'
    testImplementation 'org.springframework.security:spring-security-test'
    testCompile group: 'com.h2database', name: 'h2', version: '1.4.200'

    compile 'io.jsonwebtoken:jjwt-api:0.11.1'
    runtime 'io.jsonwebtoken:jjwt-impl:0.11.1',
            // Uncomment the next line if you want to use RSASSA-PSS (PS256, PS384, PS512) algorithms:
            //'org.bouncycastle:bcprov-jdk15on:1.60',
            'io.jsonwebtoken:jjwt-jackson:0.11.1' // or 'io.jsonwebtoken:jjwt-gson:0.11.1' for gson

    // https://mvnrepository.com/artifact/com.google.guava/guava
    compile group: 'com.google.guava', name: 'guava', version: '29.0-jre'

    annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'

    compile group: 'org.springframework.cloud', name: 'spring-cloud-gcp-starter-sql-postgresql'
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}

test {
    outputs.dir snippetsDir
    useJUnitPlatform()
}

asciidoctor {
    inputs.dir snippetsDir
    dependsOn test
}

Есть идеи?

1 Ответ

1 голос
/ 07 июня 2020

Оказалось, что причиной этой проблемы был Google Guava - я просто удалил зависимость из моего файла build.gradle, сделал gradle clean build и затем повторно развернул!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...