具有Java模块的Gradle Kotlin DSL多项目构建

时间:2019-08-13 14:13:08

标签: gradle kotlin java-module gradle-kotlin-dsl

我正在创建一个新项目(使用IntelliJ IDEA),该项目将使用:

  • 分级为构建系统
  • 用于构建脚本的Kotlin DSL
  • 用于“组织”的Java 9模块
  • 科林语为主要语言

我在设置Gradle以正确构建我的项目时遇到问题。我发现的大多数示例都是针对Groovy而非Kotlin DSL的,并且大多数仅涵盖了我想要的某些功能,但并非全部。

现在我有两个模块, core lib ,其中 core 模块需要 lib 模块。我的gradle构建脚本是:

build.gradle.kts

plugins {
    base
    kotlin("jvm") version "1.3.41" apply false
}

subprojects {
    afterEvaluate {
        tasks.withType<JavaCompile> {
            inputs.property("moduleName", extra["moduleName"])
            options.compilerArgs.addAll(arrayOf("--module-path", classpath.asPath))
            classpath = files()
        }
    }

    repositories {
        mavenCentral()
        jcenter()
    }
}

core / build.gradle.kts

extra.set("moduleName", "myproject.core")

plugins {
    kotlin("jvm")
}

dependencies {
    compile(kotlin("stdlib"))
    compile(project(":networking"))
}

lib / build.gradle.kts

extra.set("moduleName", "myproject.lib")

plugins {
    kotlin("jvm")
}

dependencies {
    compile(kotlin("stdlib"))
}

这样做,配置失败,并显示以下信息:

  

配置项目':core'时发生问题。

     

由于不存在额外的属性扩展而无法获取属性“ moduleName”

如果我删除inputs.property()行,则配置成功,但是 core 编译失败( lib 成功编译):

  

任务:core:compileKotlin

     

e:在模块图中找不到模块myproject.lib

我认为问题出在我的根build.gradle.kts上,但是我不知道如何使它起作用。到处搜寻,Kotlin DSL for Gradle有点新,没有得到广泛使用,而且文档也很稀缺。

任何建议将不胜感激!

1 个答案:

答案 0 :(得分:0)

发布问题后,我自然找到了解决方案。有一个Gradle插件可以完全满足这种情况下的需要,并带有KotlinDSL示例:https://github.com/java9-modularity/gradle-modules-plugin/tree/master/test-project-kotlin

使用插件,我要做的就是更改根build.gradle.kts文件:

plugins {
    base
    kotlin("jvm") version "1.3.41" apply false
    id("org.javamodularity.moduleplugin") version "1.5.0" apply false
}

subprojects {
    apply(plugin = "org.javamodularity.moduleplugin")

    repositories {
        mavenCentral()
        jcenter()
    }
}

注意:确保您的module-info.java文件位于java src文件夹中,而不位于kotlin src文件夹中,否则插件将无法检测到该模块。