【问题标题】:How to convert a non-gradle JUnit project (that uses Hibernate and EntityManager) to a gradle Junit project and keep it working如何将非 gradle JUnit 项目(使用 Hibernate 和 EntityManager)转换为 gradle Junit 项目并保持工作
【发布时间】:2014-11-27 16:03:38
【问题描述】:

我有一个 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 后,在 JUnit 运行期间似乎无法再访问 persistence.xml,并且我无法获得我需要执行测试的 EntityManager 实例。

我浏览了大量关于 JUnit、资源文件和 Gradle 相关问题的帖子,但没有人能告诉我如何解决问题。

有什么想法吗?提前致谢!

【问题讨论】:

  • 请编辑标题以明确问题是 Hibernate/EntityManager 所特有的。

标签: java eclipse hibernate junit gradle


【解决方案1】:

要成功运行使用 Hibernate 的测试,Hibernate 资源和相关代码必须放在同一个输出目录中:

sourceSets.main.output.resourcesDir = sourceSets.main.output.classesDir

这只是测试的问题,因为它们的类路径上有输出目录,而不是 Jar/War。 (这避免了为运行测试构建 Jar/War 的需要。)

【讨论】:

  • 感谢您的回答,但没有奏效。我在dependencies 块之后添加了您建议的行。但是,我注意到文件夹 META-INF 和文件 persistence.xml 在 build 文件夹下的任何位置都不存在。据我了解,应该有吧(抱歉,我是新手,还有很多东西要学)?
  • 使用上面的行,persistence.xml 将在build/classes/main 下的某个地方结束。如果没有,您的构建(脚本)可能存在一些基本问题。您可以尝试添加sourceSets.test.output.resourcesDir = sourceSets.test.output.classesDir,但我怀疑它会有所作为。
【解决方案2】:

感谢 Peter Niederwiser 的回答和 cmets、StackOverflow 中的 this post 以及有关 Java plugin 的 Gradle 文档的一些阅读,我能够找出问题所在并修复它。详情如下:

  1. Peter 关于更新 ma​​in 和 test 源集的resourceDir 的建议已完成(请参阅 Peter 的回答和他的 cmets)

  2. 运行时环境缺少 Hibernate 包;我更新了依赖块来添加它:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-14
    • 2013-06-17
    • 2015-12-13
    • 2020-04-11
    • 2015-04-01
    • 2016-06-09
    • 2018-07-27
    • 2017-01-24
    相关资源
    最近更新 更多