gradle - 生成后复制文件

waz*_*azz 20 java 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])
Run Code Online (Sandbox Code Playgroud)

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

你可以帮帮我吗?
谢谢.

Ren*_*hke 53

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

task copyJarToBin {
    copy {
        from 'build/libs/GradleJarProject.jar'
        into "d:/tmp"
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以使用该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"
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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


Pet*_* T. 23

我认为上面的答案有些陈旧.这是使用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
Run Code Online (Sandbox Code Playgroud)


小智 8

只是对上面的答案做了一些更正:

jar {
    baseName = "$artifactId"
    version =  '0.0.1'
}

task copyJar(type: Copy) {
    from jar // copies output of file produced from jar task
    into 'destination-folder'
}

build.finalizedBy copyJar
Run Code Online (Sandbox Code Playgroud)