Як побудувати баночку з джерелами з градель


155

Я працюю з проектом з відкритим кодом, який будується з gradle. Я хотів би генерувати (проект) -sources.jar файл, який я можу завантажити у свій IDE (IntelliJ IDEA) та налагодити через проект. Я знаю, як завантажити файл, якщо я можу генерувати його.

Я переглянув доступні завдання Gradle для проекту, і не існує жодної, яка б генерувала файл jar джерела.

Який найпростіший спосіб згенерувати файл jar джерела для цього проекту?

Додавання джерела до файлу jar, який містить компільовані файли класу, було б добре.

Відповіді:


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

4
Я приймаю цю відповідь, грунтуючись на великій специфіці, і моє припущення, що вона працює над gradle проектами, які використовують плагін Java. На жаль, він не працює в моєму випадку, оскільки проект, який я використовую, не використовує плагін Java. Я отримав помилку: "Не вдалося знайти властивість" sourceSets "для завдання": sourceJar '. "
Пол Д. Еден

У випадку, якщо це має значення, проект, про який йдеться, hsqldb 2.2.8.
Пол Д. Еден

У моїй ситуації властивість allSource не збирала файли .java, мені довелося змінити своє джерелоJar завдання на використання: from sourceSets.main.java, sourceSets.main.resources
Doug Ayers

5
Якщо я не помиляюся, вам також не потрібні специфікації залежно від класу. Gradle розглядає вхідні дані завдання, визначає, звідки вони прийшли, і автоматично створює залежність. наприклад, javadocJar витягує файли з javadoc, тому Gradle автоматично додає залежність від javadoc.
Mikezx6r

Як я можу посилатися на створені файли .jar в Android Studio? Куди мені їх покласти?
JJD

54

Якщо ви використовуєте 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
}

від сюди


34

Якщо ви хочете додати джерела до компільованого файлу JAR класів , який ви також сказали, що є прийнятним, ви можете зробити це досить легко. Просто додайте у файл збірки наступне. Ви можете бачити, що теоретично це як рішення для розміщення джерел в окрему JAR:

 jar {
     from sourceSets.main.allSource
 }

Різниця полягає в тому, що ви додаєте його до основного файлу JAR, кажучи "jar" замість sourceJar.


У системі gradle Android я отримую цю помилку: "Не вдалося знайти jar jar () для аргументів проекту типу org.gradle.api.Project"
iamreptar

@iamreptar Напевно, ви, напевно, повинні запитати Джордано (автора наступної відповіді) про це. Я не розробник Android. stackoverflow.com/a/28969412/1480995
Майкл Oryl

31

Розчин станом на Gradle 6.0

Якщо припустити, що ви використовуєте java/ java-libraryплагін з Gradle 6.0 або новішої версії, ви можете отримати sourcesJarзавдання, використовуючи таку конфігурацію:

java {
    withSourcesJar()
    // and/or analogously use “withJavadocJar()” to get a “javadocJar” task
}

Якщо ви додатково використовуєте maven-publish/ ivy-publishплагін (рекомендується сьогодні), то це також опублікує *-sources.jarартефакт разом з вашою основною публікацією на Java.

Дивіться також документи Gradle .


10

це має працювати

assemble.dependsOn 'propertyJar'

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

1
^ для цієї assemble.dependsOnчастини, завдяки якій це завдання запускається автоматично.
Jarekczek

3

DSL-еквівалент Kotlin буде таким:

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

Чи не працює для мене під Gradle 5.0: Project."java"розсмоктується в JavaPluginExtensionякий не пропонує ніяких sourceSetsабо docsDirвластивостей.
бентолор

Спробуйте скористатисяfrom(sourceSets["main"].allJava)
madhead

змінився from(javadoc)іfrom(sourceSets["main"].allSource)
Джованні Сілва

Крім того, для Котлин DSL способом , будь ласка, подивіться на відповідь: stackoverflow.com/a/60068986/2627884
amatkivskiy

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.