12

这个问题询问如何使用 Gradle 构建 SourceJar。如何使用 Gradle Kotlin DSL 做同样的事情?

gradle 代码将是:

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

5 回答 5

21

使用 Gradle 5.3.1,这更好一些,并且避免了弃用的 API:

tasks {    
    val sourcesJar by creating(Jar::class) {
        archiveClassifier.set("sources")
        from(sourceSets.main.get().allSource)
    }

    val javadocJar by creating(Jar::class) {
        dependsOn.add(javadoc)
        archiveClassifier.set("javadoc")
        from(javadoc)
    }

    artifacts {
        archives(sourcesJar)
        archives(javadocJar)
        archives(jar)
    }
}

任务assemble将创建所有工件。

于 2019-04-18T08:21:20.063 回答
14

以下将起作用:

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

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

artifacts {
    add("archives", sourcesJar)
    add("archives", javadocJar)
}

一个完整的build.gradle.kts看起来像这样:

plugins {
    kotlin("jvm") version "1.2.71"
}

repositories {
    mavenCentral()
}

dependencies {
}

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

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

    artifacts {
        add("archives", sourcesJar)
        add("archives", javadocJar)
    }
}
于 2018-10-01T18:36:14.083 回答
12

Gradle 6.0开始,这更加容易和清洁。您需要做的就是:

java {
    withSourcesJar()
    withJavadocJar()
}

查看有关java 扩展的文档及其函数withSourcesJar()withJavadocJar()

于 2020-01-12T10:10:57.980 回答
1

在Gradle 6.6上,所有描述的方法都失败并出现错误:
SourceSet with name 'main' not found

我找到了一个可行的解决方案:

tasks {
    val sourcesJar by creating(Jar::class) {
        archiveClassifier.set("sources")
        from(android.sourceSets.getByName("main").java.srcDirs)
    }

    artifacts {
        archives(sourcesJar)
    }
}
于 2020-09-15T12:47:58.127 回答
-1

使用 Gradle 5.1 你可以做这样的事情

tasks {
    val sourcesJar by registering(Jar::class) {
        classifier = "sources"
        from(sourceSets.main.get().allSource)
        dependsOn(classes)
    }
    val javadocJar by registering(Jar::class) {
        classifier = "javadoc"
        from(javadoc.get().destinationDir)
        dependsOn(javadoc)
    }
}
于 2019-01-06T18:58:33.763 回答