如何使用Gradle构建源jar


155

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

我浏览了该项目可用的gradle任务,但没有一个可以生成source jar文件。

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

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

Answers:


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插件的gradle项目。不幸的是,在我的情况下它不起作用,因为我正在使用的项目不使用java插件。我得到的错误是“在任务':sourcesJar'上找不到属性'sourceSets'。”
Paul D. Eden

如果很重要,则引用的项目为hsqldb 2.2.8。
Paul D. Eden

在我的情况下,allSource属性没有拾取.java文件,我不得不更改我的sourcesJar任务以使用:from sourceSets.main.java,sourceSets.main.resources
Doug Ayers

5
如果我没记错的话,您也不需要该类中的dependsOn规范。Gradle会查看任务的输入,确定它们来自何处,并自动创建依赖关系。例如javadocJar从javadoc提取文件,因此Gradle将自动添加dependsOn javadoc。
Mikezx6r

如何在Android Studio中引用生成的.jar文件?我必须放在哪里?
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”代替“ sourcesJar”将其添加到主JAR文件中的。


在Android的gradle系统中,我收到此错误:“在类型org.gradle.api.Project的项目上找不到参数jar()的方法”
iamreptar

@iamreptar您可能应该问有关Giordano(下一个答案的作者)的问题。我不是Android开发人员。stackoverflow.com/a/28969412/1480995
Michael 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 '16

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不提供任何内容sourceSetsdocsDir属性的问题。
bentolor

尝试使用from(sourceSets["main"].allJava)
madhead '18

改变from(javadoc)from(sourceSets["main"].allSource)
乔瓦尼·席尔瓦

同样对于kotlin DSL方式,请看一下答案:stackoverflow.com/a/60068986/2627884
amatkivskiy

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.