Как собрать исходную банку с Gradle


155

Я работаю с проектом с открытым исходным кодом, который построен с Gradle. Я хотел бы создать файл (project) -sources.jar, который я могу загрузить в свою среду IDE (IntelliJ IDEA) и выполнить отладку в рамках проекта. Я знаю, как загрузить файл, если я могу его сгенерировать.

Я просмотрел доступные задачи для проекта, и нет ни одной, которая генерирует исходный файл 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
Я принимаю этот ответ, основываясь на отличных особенностях и предполагаю, что он работает на незанятых проектах, использующих плагин Java. К сожалению, в моем случае это не работает, так как используемый мной проект не использует плагин Java. Я получаю сообщение об ошибке: «Не удалось найти свойство 'sourceSets' для задачи ': sourcesJar'."
Пол Д. Иден

В случае, если это имеет значение, упоминается проект hsqldb 2.2.8.
Пол Д. Иден

В моей ситуации свойство allSource не собирало файлы .java, мне пришлось изменить свою задачу sourcesJar: 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» вместо sourcesJar.


В системе gradle в Android я получаю эту ошибку: «Не удалось найти метод jar () для аргументов в проекте типа org.gradle.api.Project»
iamreptar

@iamreptar Вы, вероятно, должны спросить об этом Джордано (автора следующего ответа). Я не разработчик Android. stackoverflow.com/a/28969412/1480995
Майкл Орил

31

Решение от Gradle 6.0

Предполагая, что вы используете плагин java/ java-libraryGradle 6.0 или более поздней sourcesJarверсии , вы можете получить задачу, используя следующую конфигурацию:

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

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

Смотрите также документы Gradle .


11

это должно работать

assemble.dependsOn 'propertyJar'

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

1
^ для этой assemble.dependsOnчасти, которая заставляет эту задачу запускаться автоматически.
Ярекчек

3

Эквивалентом Kotlin DSL будет:

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свойств.
Bentolor

Попробуйте использоватьfrom(sourceSets["main"].allJava)
безумный

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

Также для kotlin DSL способ, пожалуйста, посмотрите на ответ: stackoverflow.com/a/60068986/2627884
amatkivskiy

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.