用Gradle Kotlin DSL构建源jar?

Mor*_*oth 4 gradle kotlin gradle-kotlin-dsl

此问题询问如何使用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
}
Run Code Online (Sandbox Code Playgroud)

Col*_*ard 10

Gradle 6.0 开始,这是一个更容易和更干净的方法。您需要做的就是:

java {
    withSourcesJar()
    withJavadocJar()
}
Run Code Online (Sandbox Code Playgroud)

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

  • Java 插件不适用于 android 库(我上次检查时不兼容) (3认同)

Mor*_*oth 8

以下将起作用:

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)
}
Run Code Online (Sandbox Code Playgroud)

一个完整的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)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @BenjaminSchmid。好的,尤其是在多模块项目中,这似乎是一个问题。在单模块项目中,Kotlin DSL中有一个扩展-“ sourceSets”。但是该访问器似乎未在多模块项目中生成,可能是由于错误所致。但是您可以使用委托来获取任何属性(实际上就像Groovy中的`methodMissing`)。所以这是一个窍门:`val sourcesJar by task.creating(Jar :: class){val sourceSets:SourceSetContainer by project; from(sourceSets [“ main”]。allJava); 分类器=“来源”;}`。虽然,我不喜欢它似乎正在工作。 (2认同)

Rap*_*ael 8

对于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)
    }
}
Run Code Online (Sandbox Code Playgroud)

任务assemble将创建所有工件。