2015-06-04 12 views
8


Provo a costruire il barattolo e dopo lo copio in un'altra cartella.gradle - copia il file dopo la sua generazione

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]) 

Ma non riesco a capire un problema. copyJarToBin task prova a copiare il vecchio jar. Se cancello/compilo cartella nel progetto ed eseguo attività buildApp(), task createJar() genererà il file .jar, ma copyJarToBin() non troverà quel file .jar.

Potrebbe aiutarmi?
Grazie.

risposta

34

Il colpevole è l'attività copyJarToBin. quando si fa

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

si copia il vaso durante il tempo di configurazione utilizzando il metodo copy. (vedere la guida per l'utente gradle al https://docs.gradle.org/current/userguide/userguide_single.html#sec:build_phases per comprendere il ciclo di vita della build) Si desidera eseguire l'operazione di copia effettiva durante la fase di esecuzione (l'esecuzione dell'attività).

Un modo per risolvere che è quello di spostare la chiamata del metodo copy in un blocco doLast:

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

    } 
} 

Il problema di questo approccio è che non si andrà a beneficio di gradles funzione di compilazione incrementale e copiare che file ogni volta che si esegue l'attività anche se il file non è stato modificato.

Un modo migliore e più idionmatic di scrivere il vostro compito copyJarToBin è di cambiare l'implementazione compito di utilizzare il tipo di Copy compito:

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

Possiamo anche migliorare questo frammento sfruttando funzionalità autowiring di Gradle. È possibile dichiarare l'output di un'attività come input in un'altra. Così, invece di scrivere `build/libs/GradleJarProject.jar' si può semplicemente fare:

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

Ora non c'è bisogno di preoccuparsi compito ordinamento come Gradle sa che il compito createJar deve essere eseguita prima che l'attività copyJarToBin può essere eseguito

+0

Grazie mille per il vostro aiuto. – wazz

1

probabilmente, è necessario per assicurare che siano eseguiti nel giusto ordine,

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

utilizzando l'attività Copia è la direzione giusta, ma è necessario sbarazzarsi del metodo 'copia' per evitare l'esecuzione dell'operazione di copia durante la fase di esecuzione –

+0

@Theresa Forster hai ragione. copyJarToBin() è stato richiamato prima di createJar(). Userò la funzione mustRunAfter. Grazie. – wazz

7

Penso che la risposta di cui sopra è in qualche modo vecchio. Ecco una risposta utilizzando 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 
Problemi correlati