2012-12-08 14 views
9

Czy Gradle może przesyłać wiele projektów do jednego słoika?Czy Gradle może przechodzić wiele projektów w jeden słoik?

Wiem, że można to zrobić za pomocą pojedynczego projektu z wykorzystaniem metody tak:

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

Ale w jaki sposób dana osoba zip kilka podprojektów w jednym słoiku?

Próbowałem to i to nie działa:

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

można użyć [fatJar] (https://github.com/musketyr/gradle-fatjar-plugin) OneJar lub [aplikacji zamek ] (http://gradle.org/docs/current/userguide/application_plugin.html). –

+0

Wszystkie 3 z nich są specyficzne dla jednego projektu. Żaden z nich nie skompresuje projektu głównego i wszystkich jego podprojektów. – djangofan

+0

Wszystkie one działają na podstawie modelu, do którego projekt zastosował, a pozostałe jako zależności. –

Odpowiedz

6

Oto moje rozwiązanie, które jest trochę prostsza:

// 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 }) 
} 

Kod został przetestowany na Gradle 1.12

+0

To nadal działa w gradle 3.1. – ndtreviv

7

ten powinien pracować na to, co chcesz zrobić. Powinno to być w pliku kompilacji root 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) 
     } 
    } 
} 

Możesz opublikować ten dodając go jako archiwum:

artifacts { 
    archives allJar 
} 
+0

Ta odpowiedź prawie odpowiedziała na moje pytanie. Dał mi wiele pomysłów, których próbowałem, ale nigdy go nie rozwiązałem. Kompilator gradle daje mi błąd: Nie można znaleźć właściwości "montażu" w projekcie. Próbowałem obejść to na różne sposoby, ale nie mogłem. Używam programu Gradle 1.2. Nadal mam nadzieję i wciąż próbuję. – djangofan

+0

Możesz spróbować przeczytać dokumentację na Gradle. Wygląda na to, że kopiujesz i wklejasz i nic nie działa. "Złóż" jest właściwością, którą daje wtyczka Java. Jeśli jeden z twoich podprojektów nie ma wtyczki java, dostaniesz błąd, o którym wspomniałeś. –

+0

Mam wtyczkę java dodaną w sekcji "allprojects". Czy nie powinno to działać dla wszystkich moich podprojektów? W każdym razie dodałem plugin java specjalnie do projektu, który narzekał i to nie pomogło. Postaram się teraz przedstawić prostszy przykład na GitHub, aby uzyskać lepszą pomoc. – djangofan

3

Poniższe rozwiązanie jest dość podobne do zaproponowanego przez CaTalyst.X, ale używa słoik zadanie bezpośrednio.

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 
    } 
} 

został przetestowany na Gradle 2.1, 2.2.1

Powiązane problemy