2012-07-13 17 views
108

Pracuję z projektem open source, który jest zbudowany z gradle. Chciałbym wygenerować plik (project) -sources.jar, który można załadować do mojego IDE (IntelliJ IDEA) i debugować w projekcie. Wiem, jak załadować plik, jeśli mogę go wygenerować.Jak budować źródła jar z gradle

Przejrzałem dostępne zadania gradle dla projektu i nie ma takiego, który wygeneruje plik jar źródła.

Jaki jest najłatwiejszy sposób wygenerowania pliku jar źródła dla tego projektu?

Dodanie źródła do pliku JAR zawierającego skompilowane pliki klas również byłoby w porządku.

Odpowiedz

191
task sourcesJar(type: Jar, dependsOn: classes) { 
    classifier = 'sources' 
    from sourceSets.main.allSource 
} 

task javadocJar(type: Jar, dependsOn: javadoc) { 
    classifier = 'javadoc' 
    from javadoc.destinationDir 
} 

artifacts { 
    archives sourcesJar 
    archives javadocJar 
} 
+3

jestem zaakceptowanie tej odpowiedzi w oparciu o n wielka szczegółowość i moje założenie działa na gradle projektów, które używają wtyczki java. Niestety, nie działa w moim przypadku, ponieważ projekt, którego używam, nie używa wtyczki java. Błąd, który otrzymuję, to "Nie można znaleźć właściwości" sourceSets "w zadaniu": sourcesJar "." –

+0

Jeśli jest to ważne, projekt, o którym mowa, to hsqldb 2.2.8. –

+0

W mojej sytuacji, właściwość allSource nie zbierała plików .java, musiałem zmienić moje zadanie sourcesJar do użycia: from sourceSets.main.java, sourceSets.main.resources –

29

Jeśli chcesz dodać źródła do skompilowanego pliku JAR klasy, która również wspomniany byłoby dopuszczalne, można to zrobić dość łatwo. Po prostu dodaj poniższe do pliku kompilacji. Widać, że w teorii, to zupełnie jak w roztworze na oddanie źródeł do osobnego słoika:

jar { 
    from sourceSets.main.allSource 
} 

Różnica polega na tym, że jesteś dodając go do głównego pliku JAR mówiąc „słoik” zamiast sourcesJar.

+0

W systemie gradle systemu Android, otrzymuję ten błąd: "Nie można znaleźć metody jar() dla argumentów na projekt typu org.gradle.api.Projekt " – iamreptar

+0

@iamreptar Powinieneś raczej zapytać Giordana (autora kolejnej odpowiedzi) o to. Nie jestem programistą Androida. Http://stackoverflow.com/a/28969412/1480995 –

43

Jeśli używasz Android:

task sourcesJar(type: Jar) { 
    from android.sourceSets.main.java.srcDirs 
    classifier = 'sources' 
} 

task javadoc(type: Javadoc) { 
    source = android.sourceSets.main.java.srcDirs 
    classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) 
} 

task javadocJar(type: Jar, dependsOn: javadoc) { 
    classifier = 'javadoc' 
    from javadoc.destinationDir 
} 

artifacts { 
    archives javadocJar 
    archives sourcesJar 
} 

od here

8

to powinno działać

assemble.dependsOn 'propertyJar' 

task propertyJar(type: Jar) { 
archiveName = "myJarName.jar" 
from('src/main/resources') { 
    include '**' 
}} 
+1

^dla tego' assemble.dependsOn 'part, co powoduje automatyczne uruchomienie tego zadania. – Jarekczek

-1

Kotlin równoważne DSL byłoby:

tasks { 

    val sourcesJar by creating(Jar::class) { 
     dependsOn(JavaPlugin.CLASSES_TASK_NAME) 
     classifier = "sources" 
     from(java.sourceSets["main"].allSource) 
    } 

    val javadocJar by creating(Jar::class) { 
     dependsOn(JavaPlugin.JAVADOC_TASK_NAME) 
     classifier = "javadoc" 
     from(java.docsDir) 
    } 

    artifacts { 
     add("archives", sourcesJar) 
     add("archives", javadocJar) 
    } 
} 
Powiązane problemy