Gradle 不会复制测试资源来构建

dr *_*rry 5 java resources gradle

我有一个多项目 gradle 项目(spring web),具有以下布局:

springweb
 |    build.gradle
 |    settings.gradle
 |_____ services
 |         build.gradle
 |         src/main/java
 |         src/main/resources
 |         src/test/java
 |         src/test/resources
 |             create-data.sql
 |_____ web
 |         build.gradle
 |         src/main/java
 |         src/main/resources
 |         src/main/webapp
 |         src/test/java
 |         src/test/resources
Run Code Online (Sandbox Code Playgroud)

当我尝试执行 src/test/resources (init.sql) 下的内容时

commandLine 'psql', '-h', 'localhost', '-d', 'junit', '--username', 'junit', '-f' , sourceSets['test'].output.resourcesDir.toString() + '/create-data.sql'
Run Code Online (Sandbox Code Playgroud)

它失败,因为资源在构建目录中不可用:

/Users/me/dev/springweb/services/build/resources/test/create-data.sql: No such file or directory
Run Code Online (Sandbox Code Playgroud)

在我的根 build.gradle 下:

ext {
    springSecurityGroup = 'org.springframework.security'
    springSecurityVersion = '3.1.4.RELEASE'
    springGroup = 'org.springframework'
    springVersion = '3.2.5.RELEASE'
    hibernateGroup = 'org.hibernate'
    hibernateVersion = '4.2.7.SP1'
}

subprojects {
    apply plugin: 'java'
    apply plugin: 'eclipse'
    sourceSets.all{
        println output.classesDir
    }

    repositories {
        mavenCentral()
    }
}
Run Code Online (Sandbox Code Playgroud)

和“服务”build.gradle:

task createDb (type:Exec) { 
     println sourceSets['test'].output.resourcesDir.toString()
     commandLine 'psql', '-h', 'localhost', '-d', 'junit', '--username', 'junit', '-f' ,'/Users/me/dev/sip/sip/sip04/src/main/resources/create-table.sql'
}
task fillDb (type:Exec, dependsOn: 'createDb') {
     commandLine 'psql', '-h', 'localhost', '-d', 'junit', '--username', 'junit', '-f' , sourceSets['test'].output.resourcesDir.toString() + '/create-data.sql'
}
test.dependsOn fillDb

dependencies {
    /* zipped */
}

/* Change context path (base url). otherwise defaults to name of project */
Run Code Online (Sandbox Code Playgroud)

我用 gradle build 执行它:

gradle build
/Users/me/dev/springweb/services/build/classes/main
/Users/me/dev/springweb/services/build/classes/test
/Users/me/dev/springweb/web/build/classes/main
/Users/me/dev/springweb/web/build/classes/test
/Users/me/dev/springweb/services/build/resources/test
:services:compileJava UP-TO-DATE
:services:processResources UP-TO-DATE
:services:classes UP-TO-DATE
:services:jar UP-TO-DATE
:services:assemble UP-TO-DATE
:services:createDb
DROP TABLE
DROP SEQUENCE
zipped
:services:fillDb/Users/me/dev/springweb/services/build/resources/test/create-data.sql: No such file or directory
Run Code Online (Sandbox Code Playgroud)

从输出中我了解到源集符合我的预期,但测试资源没有被复制。怎么了?

Per*_*ler 3

测试资源的复制是由 Java 插件中的 processTestResources 任务完成的。Java 插件还将其指定为测试任务的先决条件,以便它在测试运行之前发生。

您已经告诉 gradle 您的 fillDb 任务也是测试任务的先决条件,但您没有告诉它 processTestResources 是您的 createDb 任务的先决条件。

所以你可以做类似的事情

task createDb (type:Exec, dependsOn: 'processTestResources') { 
...
Run Code Online (Sandbox Code Playgroud)

顺便说一句,测试资源是通过类路径可供测试使用的资源。我假设您的测试实际上不需要在运行时在类路径上提供可用的 sql,那么它们是否需要在那里?