2013-05-04 16 views
7

Vorrei creare una nuova attività nel mio progetto che crea un archivio jar con i file di classe del mio progetto e i file di classe del dipendenze (chiamate anche "vaso ombreggiato" o "vaso grasso").Gradle: attività jar "clone" originale per creare una nuova attività per un jar incluse le dipendenze

La soluzione proposta dal ricettario Gradle modifica il compito barattolo standard della JavaPlugin:

jar { 
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } 
} 

Tuttavia, vorrei mantenere le taks vaso originali com'è e hanno un compito aggiuntivo per il vaso shaeded , ossia un compito che si comporta esattamente come il compito vaso, ma include i file in base alle

from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } 

e ha un altro classificatore ('ombreggiata').

ho cercato di prendere in consegna la configurazione del compito vaso copiando proprietà come questa:

task shadedJar(type: Jar, dependsOn: configurations.compile) { 
    dependencies = tasks.jar.taskDependencies 
    source = tasks.jar.source 
    manifest = tasks.jar.manifest 
    includes = tasks.jar.includes 
    classifier = 'shaded' 

    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } 
} 

Ma i compiti derivanti non prendere in mano le dipendenze di 'vaso' e il vaso risultante non include il file di classe del progetto. Inoltre, questo approccio sembra ingombrante essere il modo consigliato di utilizzare un'attività esistente come modello per uno nuovo.

Quale sarebbe un approccio raccomandabile per le mie specifiche esigenze (l'attività shadedJar separata) e per le attività di "clonazione" per utilizzarle come modelli per attività aggiuntive in generale?

(Attualmente sono ancora in Gradle 1.3, ma le soluzioni per la versione corrente Gradle sono i benvenuti)

risposta

8

Non c'è modo integrato per clonare compiti. Tuttavia, è facile da configurare l'attività fatJar per includere gli stessi file come compito del plugin javajar:

task fatJar(type: Jar) { 
    appendix = "fat" 
    from sourceSets.main.output // that's it 
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } 
} 

Task autowiring stabiliranno automaticamente le relazioni tra le attività necessarie.

Se lo script di build continua a personalizzare il compito jar, è possibile applicare le personalizzazioni a entrambe le attività contemporaneamente:

configure([jar, fatJar]) { 
    version = "2.0" 
    entryCompression = "STORED" 
} 

Se, a differenza nel caso del compito jar, si sta definendo il "modello" da soli , puoi "istanziarlo" con un metodo factory:

Problemi correlati