问题描述
我在这里遇到一个非常奇怪的问题,我认为这可能与该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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!