2012-12-08 15 views
9

Gradle può lanciare più progetti in un unico contenitore?Gradle può lanciare più progetti in un unico contenitore?

So che si può fare per un singolo progetto utilizzando un metodo come questo:

task packageTests(type: Jar) { 
    from sourceSets.test.classes 
} 

Ma come fa una persona a comprimere più sotto-progetti in un unico vaso?

Ho provato questo e non funziona:

task packageTests(type: Jar) { 
    from project(':core').sourceSets.main.classes 
    from project(':core:google').sourceSets.test.classes 
    from project(':core:bing').sourceSets.test.classes 
} 
+0

È possibile usare [fatJar] (https://github.com/musketyr/gradle-fatjar-plugin), OneJar, o [applicazione zip ] (http://gradle.org/docs/current/userguide/application_plugin.html). –

+0

Tutti e 3 di questi sono 1 progetto specifico. Nessuno di essi comprimerà un progetto radice e tutti i suoi sottoprogetti. – djangofan

+0

Tutti funzionano in base al modello a cui il progetto ha applicato gli altri come dipendenze. –

risposta

6

Ecco la mia soluzione, che è un po 'più semplice:

// Create a list of subprojects that you wish to include in the jar. 
def mainProjects = [':apps',':core',':gui',':io'] 
task oneJar(type: Jar , dependsOn: mainProjects.collect{ it+":compileJava"}) { 
    baseName = 'name of jar' 
    from files(mainProjects.collect{ project(it).sourceSets.main.output }) 
} 

Codice è stato testato su Gradle 1.12

+0

Questo funziona ancora in Gradle 3.1. – ndtreviv

7

Questo dovrebbe funzionare per ciò che si vuole fare. Questo dovrebbe essere nel file di build gradle root.

subprojects.each { subproject -> evaluationDependsOn(subproject.path)} 

task allJar(type: Jar, dependsOn: subprojects.assemble) { 
    baseName = 'your-base-name' 
    subprojects.each { subproject -> 
     from subproject.configurations.archives.allArtifacts.files.collect { 
     zipTree(it) 
     } 
    } 
} 

È possibile pubblicare questo aggiungendo come un archivio:

artifacts { 
    archives allJar 
} 
+0

Questa risposta ha quasi risposto alla mia domanda. Mi ha dato un gran numero di idee che ho provato, ma non l'ho mai risolto. Il compilatore gradle mi dà l'errore: Impossibile trovare la proprietà 'assemblare' sul progetto. Ho cercato di aggirarlo in vari modi ma non ci sono riuscito. Sto usando Gradle 1.2. Sono ancora fiducioso e continuo a provarci. – djangofan

+0

Si potrebbe provare a leggere la documentazione su Gradle. Sembra che tu sia una specie di copia e incolla e niente funziona. 'assemblare' è una proprietà fornita dal plug-in Java. Se uno dei tuoi sottoprogetti non ha il plugin java, otterrai l'errore che hai citato. –

+0

Ho aggiunto il plugin java all'interno della sezione "allprojects". Non dovrebbe funzionare per tutti i miei sottoprogetti? In ogni caso ho aggiunto il plugin java in modo specifico al progetto che si stava lamentando e non ha aiutato. Proverò a mettere un esempio più semplice su GitHub stasera per ottenere un aiuto migliore. – djangofan

3

La seguente soluzione è abbastanza simile a quella proposta da CaTalyst.X ma utilizza jar attività direttamente.

subprojects.each { subproject -> evaluationDependsOn(subproject.path) } 
jar.dependsOn subprojects.tasks['classes'] 
jar { 
    baseName = 'MyApp' 
    manifest { 
    attributes 'Main-Class': 'org.abc.App' 
    } 
    subprojects.each { subproject -> 
    from subproject.sourceSets.main.output.classesDir 
    from subproject.sourceSets.main.output.resourcesDir 
    } 
} 

E 'stato testato contro Gradle 2.1 e 2.2.1

Problemi correlati