簡體   English   中英

多項目 Gradle+Kotlin:如何使用 Kotlin DSL 創建包含所有子項目的 Jar?

[英]Multi-project Gradle+Kotlin: How to create Jar containing all sub-projects using Kotlin DSL?

我有一個帶有兩個子項目的 Gradle 項目。 父代不包含任何代碼; 所有 Kotlin 代碼都在兩個子項目中。 所有 Gradle 構建文件都在 Kotlin DSL 中定義。

在構建時,Gradle 會生成兩個 JAR 文件,一個位於每個子項目的build子文件夾中。 我相信這是 Gradle 的預期默認行為。 但這不是我想要的。

我想將父項目的 JAR 文件發布為 Maven 工件。 因此,我需要將兩個子項目都包含在一個 JAR 文件中。 我怎樣才能做到這一點?

注意:在此 web 頁面上,作者似乎在此代碼段中實現了我所需要的內容:

apply plugin: "java"

subprojects.each { subproject -> evaluationDependsOn(subproject.path)}

task allJar(type: Jar, dependsOn: subprojects.jar) {
    baseName = 'multiproject-test'
    subprojects.each { subproject ->
        from subproject.configurations.archives.allArtifacts.files.collect {
            zipTree(it)
        }
    }
}

artifacts {
    archives allJar
}

但是,這是在 Gradle 的原生 Groovy DSL 中定義的。 而且我發現自己無法將其翻譯成 Kotlin DSL。 I tried to put a Groovy build file ( *.gradle ) besides the Kotlin build file ( *.gradle.kts ), but this led to a strange build error. 我不確定是否支持混合構建文件語言。 此外,我也認為這是不好的做法。 最好只用一種語言定義所有構建文件。

此外,上面的示例適用於 Java 編程語言。 But I do not expect this to be a big problem, as both Java and Kotlin produce JVM bytecode as compile output.

更多說明:

  • 我不是在談論“胖 JAR”。 依賴項和 Kotlin 庫不應包含在 JAR 中。
  • 我不在乎子項目的 JAR 文件是否仍在構建中。 我只對包含兩個子項目的集成 JAR 感興趣。
  • 要點是為二進制文件獲取組合的 JAR。 結合 JARs 作為源代碼和 JavaDoc 將是一個不錯的選擇,但並非嚴格要求。

我將使用 Gradle 文檔中的 Gradle 指南創建“uber”或“fat”JARs作為基礎。 你想要的本質上是一樣的。 它也比您找到的 Groovy 示例好得多,因為它不使用不鼓勵的subprojects實用程序,或需要了解其他項目如何配置的“ 簡單共享”。

  1. 創建用於解析其他項目的配置。

     // build.gradle.kts val uberJar by configurations.creating<Configuration> { // we're going to resolve this config here, in this project isCanBeResolved = true // this configuration will not be consumed by other projects isCanBeConsumed = false // don't make this visible to other projects isVisible = false }
  2. 使用新配置添加對我們要添加到組合 Jar 中的項目的依賴項

    dependencies { mergedJar(project(":my-subproject-alpha")) mergedJar(project(":my-subproject-beta")) }
  3. 現在從 docs 復制指南,除了不使用configurations.runtimeClasspath我們可以使用mergedJar配置,它只會創建我們指定的子項目。

    但是我們需要做一些修改。

    1. 我已調整示例以編輯現有的 Jar 任務,而不是創建新的“fatJar”任務。
    2. 出於某種原因,設置isTransitive = false會導致 Gradle 無法解析。 相反,我添加了一個過濾器( it.path.contains(rootDir.path) )以確保我們正在使用的 Jars 在項目中。
     tasks.jar { dependsOn(mergedJar) from({ mergedJar.filter { it.name.endsWith("jar") && it.path.contains(rootDir.path) }.map { logger.lifecycle("depending on $it") zipTree(it) } }) }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM