gradle – 生成后复制文件

我尝试构建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文件。

你可以帮帮我吗?
谢谢。

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

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

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

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

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

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

编写copyJarToBin任务的更好和更具惯用性的方法是更改​​任务实现以使用Copy任务类型:

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

我们甚至可以通过利用gradle的自动assemblyfunction来改进此片段。 您可以将一个任务的输出声明为另一个任务的输入。 因此,您可以简单地执行以下操作,而不是编写`build / libs / GradleJarProject.jar’。

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

现在您不需要打扰任务排序,因为gradle知道必须在执行copyJarToBin任务之前执行copyJarToBin任务。

我认为上面的回答有些陈旧。 以下是使用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 

您可能需要确保它们以正确的顺序运行,

 task copyJarToBin(type:Copy,dependsOn:[createJar]) { copy { from "${buildDir}/GradleJarProject.jar" // needs to be gstring into "d:/tmp" } }