我有一个JPA/Hibernate项目,它实现了许多存储库接口(我使用DDD),我还有一个项目通过使用JUnit 4测试第一个。我的IDE是Eclipse Luna。我后来才知道,我可以同时使用运行时代码和测试代码制作一个项目,但此时,我将它们在这两个项目中分开。
到目前为止,一切正常。
现在,我决定将我的测试项目转换为 Gradle 项目。转换后,我创建了这个build.gradle
文件
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'application'
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
}
repositories {
mavenLocal()
mavenCentral()
}
jar {
baseName = 'dominio.hibernate.tests'
version = '0.1.0'
}
dependencies {
compile 'junit:junit:4.11'
compile 'org.hamcrest:hamcrest-all:1.3'
runtime fileTree(dir: '../dominio/build/libs', include: '*.jar')
compile fileTree(dir: '../dominio/build/libs', include: '*.jar')
runtime fileTree(dir: '../dominio.hibernate/build/libs', include: '*.jar')
compile fileTree(dir: '../dominio.hibernate/build/libs', include: '*.jar')
compile 'postgresql:postgresql:9.0-801.jdbc4'
compile 'org.hibernate:hibernate-core:4.3.6.Final'
compile 'org.hibernate:hibernate-c3p0:4.1.0.Final'
compile "javax.enterprise:cdi-api:1.0-SP1"
compile "javax.servlet:servlet-api:2.5"
runtime "org.jboss.weld:weld-core:1.0.1-SP1"
compile project(':Dominio')
compile project(':DominioHibernate')
}
task wrapper(type: Wrapper) {
gradleVersion = '1.11'
}
编译工作得很好,但是当我运行测试时,即在 Eclipse 或 Gradle 中运行,我有以下异常
javax.persistence.PersistenceException: No Persistence provider for EntityManager named unidades
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:61)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39)
at dominio.hibernate.tests.HibernateUnidadeOrganizacionalRepositoryTests.setUp(HibernateUnidadeOrganizacionalRepositoryTests.java:36)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
... the rest of the stack
我强调的是,Java代码没有任何变化,并且在Gradle出现之前运行良好。
因此,似乎在将项目转换为 Gradle 项目后,persistence.xml
在 JUnit 运行期间不再可访问,并且我无法获得执行测试所需的EntityManager
实例。
我浏览了大量关于JUnit,资源文件和Gradle相关问题的帖子,但没有一个能告诉我如何解决这个问题。
有什么想法吗?提前感谢!
要成功运行使用 Hibernate 的测试,Hibernate 资源和相关代码必须放在同一个输出目录中:
sourceSets.main.output.resourcesDir = sourceSets.main.output.classesDir
这只是测试的问题,因为它们的类路径上有输出目录,而不是 Jar/War。 (这避免了为运行测试而构建 Jar/War 的需要。
感谢Peter Niederwiser的回答和评论,StackOverflow中的这篇文章以及一些关于Java插件的Gradle文档的阅读,我能够找出问题所在并修复它。扣留如下:
- Peter
关于更新主源集和测试源集
resourceDir
的建议已经完成(参见 Peter 的回答和他的评论)运行时环境缺少休眠包;我更新了依赖项块以添加它:
依赖关系 { ... 编译 'org.hibernate:hibernate-entitymanager:4.3.6.Final' 运行时 'org.hibernate:hibernate-entitymanager:4.3.6.Final' ...}
只有这两个步骤结合起来解决了我的问题。META-INF 文件夹被复制到正确的位置,并且(现在存在的)Hibernate 包在那里处理persistence.xml
以便创建我的测试代码所需的EntityManager
实例。