不推荐使用Gradle copy命令,中断构建

时间:2018-08-02 15:35:52

标签: java gradle

在Gradle 3.x中,我可以通过以下块将一些xml映射文件复制到build / jar之前的classes目录中:

copy{

  from 'src/main/java/com/company/mapping'
  into 'build/classes/main/java/com/company/mapping'
  include '**/*.xml'

}

在Gradle 4.9中,已弃用此方法,而赞成:

task copyMappings(type: Copy){

  from 'src/main/java/com/company/mapping'
  into 'build/classes/main/java/com/company/mapping'
  include '**/*.xml'

}

copyMappings任务成功完成,但是build / jar不等待copyMappings完成。我已经尝试了build.dependsOn和doFirst {copyMappings} doLast {build}的变体,但是似乎没有什么能使我获得在jar之前将复制的文件放在“ into”路径中的预期效果。 这适用于Windows 10。

2 个答案:

答案 0 :(得分:1)

这对我在Mac OS上的Gradle 4.9适用:

apply plugin: 'java'

task copyMappings(type: Copy) {
  from 'src/main/java/com/company/mapping'
  into 'build/classes/main/java/com/company/mapping'
  include '**/*.xml'
}

jar.dependsOn copyMappings

jar.doFirst {
    assert new File("${projectDir}/build/classes/main/java/com/company/mapping/abc.xml").exists()
    assert new File("${projectDir}/build/classes/main/java/com/company/mapping/def.xml").exists()
}

命令行为gradle clean jar

答案 1 :(得分:0)

我喜欢在适当的情况下围绕源集对事物进行建模,因此,我们可以使用各种插件和用例来更可靠地进行构建。例如,假设您想直接从类文件和资源中运行应用程序,而不是先将其打包为JAR。您可以确保“运行”任务也取决于副本,但是您必须在每个需要此副本的实例上都这样做。

源集是理想的解决方案,因为它们具有运行时类路径的概念,可用于打包,检测,运行,测试等。

考虑到这一点,我将进行以下简单声明并摆脱复制任务:

sourceSets {
    main {
        resources {
            srcDir "src/main/java"
            include "**/*.xml"
        }
    }
}

XML文件将以与当前方法不同的目录结尾,但这无关紧要,除非您有承担假定位置的任务而不是使用源集模型来获取必要的信息。

注意上面的include指令也适用于 src / main / resources 中的所有资源。因此,如果其中有属性文件或文本文件或其他任何文件,则将它们排除在外。最简单的解决方案是将所有必需的资源文件模式添加到include指令中。