175

我正在使用一个使用 Gradle 构建的开源项目。我想生成一个(项目)-sources.jar文件,我可以将其加载到我的 IDE(IntelliJ IDEA)中并通过项目进行调试。如果可以生成文件,我知道如何加载文件。

我查看了该项目的可用 Gradle 任务,但没有一个可以生成源 jar 文件。

为该项目生成源 jar 文件的最简单方法是什么?

将源代码添加到包含已编译类文件的 jar 文件中也可以。

4

9 回答 9

257
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
}
于 2012-07-13T17:05:53.217 回答
55

如果您使用的是安卓:

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
}

这里

于 2015-03-10T16:45:08.113 回答
53

Gradle 6.0 的解决方案

假设您在 Gradle 6.0 或更高版本中使用java/java-library插件,您可以sourcesJar使用以下配置获取任务:

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

如果您另外使用maven-publish/ivy-publish插件(现在推荐),那么这也会*-sources.jar与您的主要 Java 出版物一起发布一个工件。

另请参阅Gradle 文档

于 2019-11-13T21:04:24.813 回答
41

如果您希望将源代码添加到已编译的类 JAR 文件中,您也说过这是可以接受的,那么您可以很容易地做到这一点。只需将以下内容添加到您的构建文件中。您可以看到,理论上,它非常类似于将源代码放入单独的 JAR 中的解决方案:

 jar {
     from sourceSets.main.allSource
 }

不同之处在于您通过说“jar”代替sourceJar 将其添加到主JAR 文件中。

于 2014-10-08T16:35:21.320 回答
12

这应该工作

assemble.dependsOn 'propertyJar'

task propertyJar(type: Jar) {
 archiveName = "myJarName.jar"
 from('src/main/resources') {
    include '**'
 }}
于 2015-07-09T11:21:14.943 回答
8

使用时:

  • 等级:5+
  • javamaven-publish插件
task sourceJar(type: Jar) {
    from sourceSets.main.allJava
    archiveClassifier = "sources"
}

publishing {
    publications {
        maven(MavenPublication) {
            from components.java
            artifact sourceJar
        }
    }
}

https://docs.gradle.org/current/dsl/org.gradle.api.publish.maven.MavenPublication.html

于 2020-01-27T21:05:46.720 回答
6

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)
    }
}
于 2018-01-03T03:12:19.880 回答
0

这就是我使用 Kotlin DSL (build.gradle.kts) 为我的 Android Kotlin 库包含Dokka在线查看)和源 JAR 的方式:

plugins {
    // ...
    id("org.jetbrains.dokka") version "1.4.32"
    id("maven-publish")
}

lateinit var sourcesArtifact: PublishArtifact
lateinit var javadocArtifact: PublishArtifact

tasks {
    val sourcesJar by creating(Jar::class) {
        archiveClassifier.set("sources")
        from(android.sourceSets["main"].java.srcDirs)
    }
    val dokkaHtml by getting(org.jetbrains.dokka.gradle.DokkaTask::class)
    val javadocJar by creating(Jar::class) {
        dependsOn(dokkaHtml)
        archiveClassifier.set("javadoc")
        from(dokkaHtml.outputDirectory)
    }
    artifacts {
        sourcesArtifact = archives(sourcesJar)
        javadocArtifact = archives(javadocJar)
    }
}

publishing {
    // ...
    publications {
        create<MavenPublication>("MyPublication") {
            from(components["release"])
            artifact(sourcesArtifact)
            artifact(javadocArtifact)
            // ...
        }
    }
}
于 2022-01-26T06:55:50.227 回答
0

安卓:

  task androidSourcesJar(type: Jar) {
        getArchiveClassifier().set('sources')
        from android.sourceSets.main.java.srcDirs//full sources
  }

爪哇:

 task sourcesJar(type: Jar, dependsOn: classes) {
        getArchiveClassifier().set('sources')
        from sourceSets.main.allSource
    }
于 2022-02-09T10:03:05.983 回答