gradle - 生成文件后复制文件

2022-09-01 04:46:36


我尝试构建jar,然后将其复制到另一个文件夹。

task createJar(type: Jar) {
    archiveName = "GradleJarProject.jar"
    manifest {
        attributes 'Implementation-Title': 'Gradle Jar File Example',  
            'Implementation-Version': version,
            'Main-Class': 'me.test.Test'
    }
    baseName = project.name
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
    with jar

}

task copyJarToBin {
    copy {
        from 'build/libs/GradleJarProject.jar'
        into "d:/tmp"
    }
}

task buildApp (dependsOn: [clean, createJar, copyJarToBin])

但我无法找出一个问题。copyJarToBin 任务尝试复制旧的 jar。如果我删除项目中的 /build 文件夹并运行 buildApp() 任务,任务 createJar() 将生成.jar文件,但 copyJarToBin() 找不到该文件.jar文件。

你能帮我吗?
谢谢。


答案 1

罪魁祸首是你的任务。做时copyJarToBin

task copyJarToBin {
    copy {
        from 'build/libs/GradleJarProject.jar'
        into "d:/tmp"
    }
}

在配置期间使用该方法复制 jar。(请参阅 https://docs.gradle.org/current/userguide/userguide_single.html#sec:build_phases 中的 gradle 用户指南,了解构建生命周期)您希望在执行阶段(任务的执行)运行实际的复制操作。copy

解决此问题的一种方法是将方法的调用移动到 doLast 块中:copy

task copyJarToBin {
    doLast {
        copy {
            from 'build/libs/GradleJarProject.jar'
            into "d:/tmp"
        }

    }
}

这种方法的问题在于,即使文件没有更改,您也不会受益于渐变增量构建功能,也不会在每次执行任务时复制该文件。

编写 copyJarToBin 任务的一种更好、更惯用的方法是将任务实现更改为使用任务类型:Copy

task copyJarToBin(type: Copy) {
    from 'build/libs/GradleJarProject.jar'
    into "d:/tmp"
}   

我们甚至可以通过利用gradle的自动布线功能来改进这个代码段。您可以将一个任务的输出声明为另一个任务的输入。因此,与其编写“build/libs/GradleJarProject.jar”,不如简单地执行以下操作:

task copyJarToBin(type: Copy) {
    from createJar // shortcut for createJar.outputs.files
    into "d:/tmp"
}   

现在,您无需为任务排序而烦恼,因为 gradle 知道在执行任务之前必须执行任务。createJarcopyJarToBin


答案 2

我认为上面的答案有些陈旧。这是使用 gradle 3.3 的答案

jar {
    baseName = 'my-app-name'
    version =  '0.0.1'
}

task copyJar(type: Copy) {
    from jar // here it automatically reads jar file produced from jar task
    into 'destination-folder'
}

build.dependsOn copyJar

推荐