如何将非 gradle JUnit 项目(使用 Hibernate 和 EntityManager)转换为 gradle



我有一个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
  1. 关于更新主源集和测试源集resourceDir的建议已经完成(参见 Peter 的回答和他的评论)

  2. 运行时环境缺少休眠包;我更新了依赖项块以添加它:

    依赖关系 { ... 编译 'org.hibernate:hibernate-entitymanager:4.3.6.Final' 运行时 'org.hibernate:hibernate-entitymanager:4.3.6.Final' ...}

只有这两个步骤结合起来解决了我的问题。META-INF 文件夹被复制到正确的位置,并且(现在存在的)Hibernate 包在那里处理persistence.xml以便创建我的测试代码所需的EntityManager实例。

最新更新