使用Gradle Kotlin DSL构建源代码jar包?

19

这个问题询问如何使用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
}
5个回答

26

使用 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将创建所有构件。


17
下面的内容可行:

The following will work:

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)
    }
}

随着Gradle 5.0的发布,代码行from(tasks["javadoc"])不再可用,因为它解析为一个没有任何get(int)操作的TaskProvider<TaskReportTask> - bentolor
1
@BenjaminSchmid,尝试使用val javadocJar by creating(Jar::class) { val javadoc by tasks; from(javadoc); classifier = "javadoc"; } - madhead
1
谢谢 @madhead :有没有办法委托 sourceSets["main"] 的调用? - bentolor
val main by sourcesets :) - madhead
2
@BenjaminSchmid。好的,这似乎是一个特别针对多模块项目的问题。在单模块项目中,Kotlin DSL中有一个名为“sourceSets”的扩展。但是该访问器在多模块项目中似乎没有生成,可能是由于某个错误导致的。但是你可以使用委托来获取任何属性(实际上就像Groovy中的“methodMissing”)。所以这里是一个技巧:val sourcesJar by tasks.creating(Jar :: class){ val sourceSets: SourceSetContainer by project; from(sourceSets ["main"] .allJava); classifier = "sources";}。虽然我不喜欢它,但它似乎有效。 - madhead

15

表达式“java”无法作为函数调用。如果您尝试在子项目块中使用该函数“invoke()”,则会发现该函数不存在,因此无法使其适用于子项目。 - Hakanai
1
显然,解决这个问题的方法是将其更改为configure<JavaPluginExtension> { ... } - Hakanai
2
Java插件不适用于Android库(据我上次检查时不兼容)。 - Alix

3

所有描述的方法在Gradle 6.6上都会出现错误:
未找到名称为“main”的SourceSet

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

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

    artifacts {
        archives(sourcesJar)
    }
}

-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)
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接