ot在已编译的jar中创建EntityManagerFactor

ot在已编译的jar中创建EntityManagerFactor

本文介绍了Hibernate无法使用Spring Boot在已编译的jar中创建EntityManagerFactory bean的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在这里遇到一个非常奇怪的问题,我认为这可能与该SO帖子有关:.但是,我无法将答案映射到我的确切情况.

I am running into a very strange issue here and I think it might be related to this SO post: Spring Boot exported jar not working (org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory'). However I cannot map the answer to my exact case.

当我从IntelliJ IDE运行我的项目时,它运行良好,并且当我将其编译为jar(并在Docker Cloud上运行)时,出现以下异常:

When I run my project from IntelliJ IDE it works fine and when I compile it as a jar (and run it on Docker Cloud) I get the following exception:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.hibernate.engine.spi.SessionFactoryImplementor.getProperties()Ljava/util/Properties;

我认为相关部分是这样的: org.hibernate.engine.spi.SessionFactoryImplementor.getProperties()Ljava/util/Properties;

The relevant part ist this I think: org.hibernate.engine.spi.SessionFactoryImplementor.getProperties()Ljava/util/Properties;

我尝试清理构建目录并再次构建,但是该错误仍然存​​在于jar文件中.在Google上四处搜寻,发现有很多帖子暗示这是JPA的旧版本,无法与当前的休眠版本一起使用.

I tried cleaning the build directory and building again, but the error persists in the jar file. Googling around I found multiple posts suggesting that it is an old version of JPA not working with the current hibernate version.

这是我当前的gradle构建文件: 组"com.energiedienst.smartcity.middleware" 版本"0.1"

This is my current gradle build file: group 'com.energiedienst.smartcity.middleware' version '0.1'

    apply plugin: 'java'
    apply plugin: "idea"
    apply plugin: 'com.bmuschko.docker-java-application'
    apply plugin: 'com.bmuschko.docker-remote-api'
    apply plugin: 'org.springframework.boot'

    import com.bmuschko.gradle.docker.tasks.image.*

    repositories {
        mavenCentral()
    }

    ext {
        springCloudVersion = '1.2.1.RELEASE'
        jettyVersion = '9.4.2.v20170220'
        jacksonVersion = '2.8.8'
        springSecurityVersion = '4.2.3.RELEASE'
        springBootVersion = '1.5.6.RELEASE'

        dockerBaseImage = getProperty('docker.baseImage')
        dockerRegistryUrl = getProperty('docker.registry.url')
        dockerRegistryName = getProperty('docker.registry.name')
        dockerRegistryUsername = getProperty('docker.registry.username')
        dockerRegistryPassword = getProperty('docker.registry.password')
    }

    configurations {
        runtimeOnly
        all {
            exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
            exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
        }
    }

    buildscript {
        repositories {
            jcenter()
            mavenCentral()
        }
        dependencies {
            classpath 'com.bmuschko:gradle-docker-plugin:3.0.11'
            classpath 'org.springframework.boot:spring-boot-gradle-plugin:1.5.6.RELEASE'
        }
    }

    dependencies {
        compile("org.springframework.boot:spring-boot-starter-aop:${springBootVersion}")
        compile("org.springframework.boot:spring-boot-starter-security:${springBootVersion}")
        compile("org.springframework.boot:spring-boot-starter-thymeleaf:${springBootVersion}")
        compile("org.springframework.boot:spring-boot-starter-web:${springBootVersion}")
        compile("org.springframework.boot:spring-boot-starter-data-jpa:${springBootVersion}")
        compile("org.springframework.boot:spring-boot-starter-log4j2:${springBootVersion}")
        compile("org.springframework.boot:spring-boot-starter-jetty:${springBootVersion}")

        compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: jacksonVersion
        compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: jacksonVersion
        compile group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: jacksonVersion
        compile 'com.bedatadriven:jackson-datatype-jts:2.2'
        compile 'com.fasterxml.jackson.datatype:jackson-datatype-hibernate5:2.9.0'

        compile group: 'org.springframework.security.oauth', name: 'spring-security-oauth2', version: '2.0.12.RELEASE'

        compile group: 'com.github.paulcwarren', name: 'spring-content-s3-boot-starter', version: '0.0.5'
        compile group: 'mysql', name: 'mysql-connector-java', version: '6.0.6'
        compile group: 'org.hibernate', name: 'hibernate-core', version: '5.2.10.Final'
        compile group: 'org.hibernate', name: 'hibernate-spatial', version: '5.2.10.Final'

        compile group: 'commons-io', name: 'commons-io', version: '2.5'

        compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.5'

        compile group: 'org.reflections', name: 'reflections', version: '0.9.10'

        compile group: 'org.projectlombok', name: 'lombok', version: '1.16.16'

        testCompile("org.springframework.boot:spring-boot-starter-test")
        testCompile("org.springframework.security:spring-security-test")
    }
    //..... docker build stuff from here

如果我使用grep进行持久化,似乎其中没有不同的版本

If I grep for persistence however it doesn't seem like there are different versions in there

Azalea ::  » gradle dependencies|grep persistence           1 ↵
|    |    +--- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final
|    |    +--- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final
|    |    +--- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final
|    |    +--- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final
|    |    +--- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final
|    |    +--- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final
|    |    +--- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final
|    |    +--- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final
|    |    +--- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final
|    |    +--- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final
|    |    +--- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final
|    |    +--- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final
|    |    +--- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final
|    |    +--- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final
|    |    +--- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final
|    |    +--- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final
|    |    +--- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final
|    |    +--- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final

任何想法该如何调试,我在这里完全走错了路吗?

Any idea how to debug this, am I completely on the wrong path here?

欢呼和感谢.

推荐答案

这种气味是正确的,...在本地起作用,因为从我的IntelliJ启动hibernate-jpa jar时,它在我的类路径中被解析.我觉得IntelliJ正在使用休眠作为数据库插件.

The smell was right,... it worked locally because from somewhere the hibernate-jpa jar was in my classpath and got resolven when I started it from IntelliJ. I have the feeling IntelliJ is using hibernate for the database plugin.

添加

compile group: 'org.hibernate', name: 'hibernate-entitymanager', version: hibernateVersion
compile group: 'org.hibernate.javax.persistence', name: 'hibernate-jpa-2.1-api', version: '1.0.0.Final'

解决了该问题.我认为hibernate-entitymanager负责修复.检查gradle dependencies之后,我看到加载了管理器的5.0.x版本(无论如何),该版本与JPA2不兼容.添加显式依赖项会将正确的版本加载到jar中.

fixed the problem. I think hibernate-entitymanager is responsible for the fix. After checking gradle dependencies I saw I had a 5.0.x version of entitymanager loaded (whyever...) which is not compatible with JPA2. Adding the explicit dependency loaded the right version into the jar.

这篇关于Hibernate无法使用Spring Boot在已编译的jar中创建EntityManagerFactory bean的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!