【问题标题】:Gradle copy command deprecated, breaks build不推荐使用 Gradle 复制命令,中断构建
【发布时间】:2019-01-10 10:49:37
【问题描述】:

在 Gradle 3.x 中,我可以通过以下块在 build/jar 之前将一些 xml 映射文件复制到 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 之前将复制的文件放在“进入”路径中。 这适用于 Windows 10。

【问题讨论】:

  • 为什么说build.dependsOn() 已弃用?这听起来不正确。
  • 说明您使用的操作系统可能有用(对其他人)?
  • 适用于 Windows 10。

标签: java gradle


【解决方案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

【讨论】:

  • 这在 Gradle 4.9 中对我不起作用。它返回与我原来的方法相同的结果。文件进入 build/classes 目录,但 build/jar 在文件复制成功之前发生。
【解决方案2】:

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

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

考虑到这一点,我会选择这个简单的声明并摆脱复制任务:

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

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

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

【讨论】:

    猜你喜欢
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 2022-01-22
    • 2021-12-20
    相关资源
    最近更新 更多