【发布时间】:2015-02-22 20:55:47
【问题描述】:
我试图完成以下工作
1) 在测试运行前使用 gradle-flyway 插件创建 h2 数据库。我能够创建它并将其放在 ${buildDir}
下flyway {
url = "jdbc:h2:file:${buildDir}/db/test/xxxdb"
user = 'root'
locations = [
'classpath:sql'
]
}
2) 我的目标是针对步骤 1 中创建的这个数据库编写集成测试。我使用 c3p0 进行池化,这是我的配置。
<?xml version="1.0"?>
<c3p0-config>
<default-config>
<property name="driverClass">org.h2.Driver</property>
**<property name="jdbcUrl">jdbc:h2:file:@buildDir@/db/test/xxxdb</property>**
<property name="user">xxx</property>
<property name="password">xxx</property>
<property name="minPoolSize">1</property>
<property name="maxPoolSize">50</property>
<property name="acquireIncrement">1</property>
</default-config>
</c3p0-config>
问题:
a) 如何配置 c3p0 以引用在步骤 1 中创建的构建目录中存在的 h2 数据库。c3p0 需要 jdbcUrl 属性中的绝对路径。
b) 我使用下面的 gradle 任务配置了 gradle 以将 @buildDir@ 替换为适当的值。因此,当我执行“gradle build”时,数据库jdbcUrl 已为 c3p0 正确配置。但是当我通过 intelliJ 运行测试时,它仍然会读取值包含“@buildDir@”的jdbcUrl,因为 intellij 在运行测试之前不会运行processTestResources 任务。
processTestResources {
filter(ReplaceTokens, tokens: [buildDir: buildDir.getAbsolutePath()])
}
关于如何解决这个问题的任何想法?
【问题讨论】:
-
您应该能够使用相对路径。从 IntelliJ 运行时,工作目录应该是您的项目目录。在 Gradle 中,它也将是项目目录,但在多项目构建的情况下,它将是当前项目的目录。
-
马克,知道如何为多项目构建解决这个问题吗?正如您所说,intellij 是相对于项目目录查找的,但 gradle 是从当前项目的目录中查找的。span>
-
或者,您可以通过 system property 设置
jdbcUrl属性,该属性可以在 IntelliJ JUnit run configuration 的 VM 选项中进行配置。