gradle – copie le fichier après sa génération

J’essaie de construire un bocal et ensuite de le copier dans un autre dossier

task createJar(type: Jar) { archiveName = "GradleJarProject.jar" manifest { atsortingbutes 'Implementation-Title': 'Gradle Jar File Example', 'Implementation-Version': version, 'Main-Class': 'me.test.Test' } baseName = project.name from { configurations.comstack.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]) 

Mais je ne peux pas résoudre un problème. tâche CopyJarToBin essayer de copier le vieux jar. Si je supprime / crée le dossier dans le projet et exécute la tâche buildApp (), la tâche createJar () générera le fichier .jar, mais copyJarToBin () ne trouvera pas ce fichier .jar.

Pourriez-vous m’aider?
Merci.

Le coupable est votre tâche copyJarToBin . en faisant

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

vous copiez le fichier pendant la configuration à l’aide de la méthode de copy . (voir le guide de l’utilisateur Gradle à l’ adresse https://docs.gradle.org/current/userguide/userguide_single.html#sec:build_phases pour comprendre le cycle de vie de la génération). Vous souhaitez exécuter l’opération de copie proprement dite pendant la phase d’exécution (l’exécution de la tâche).

Une façon de résoudre ce problème consiste à déplacer l’appel de la méthode copy dans un bloc doLast:

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

Le problème avec cette approche est que vous ne tirerez pas parti de la fonction de construction incrémentielle de gradles et que vous copiez ce fichier à chaque fois que vous exécutez la tâche, même si le fichier n’a pas changé.

Un moyen plus efficace et plus idionmatique d’écrire votre tâche copyJarToBin consiste à modifier son implémentation pour utiliser le type de tâche Copy :

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

Nous pouvons même améliorer cet extrait en tirant parti de la fonction de câblage automatique de Gradle. Vous pouvez déclarer la sortie d’une tâche en tant qu’entrée d’une autre. Ainsi, au lieu d’écrire «build / libs / GradleJarProject.jar», vous pouvez simplement faire:

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

Maintenant, vous n’avez plus besoin de vous préoccuper de l’ordre des tâches, car gradle sait que la tâche createJar doit être exécutée avant que la tâche copyJarToBin puisse être exécutée.

Je pense que la réponse ci-dessus est en quelque sorte ancienne. Voici une réponse en utilisant le grade 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 

Vous devez probablement vous assurer qu’ils sont exécutés dans le bon ordre,

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