gradle - 使用 Java 模块构建 Gradle Kotlin DSL 多项目
问题描述
我正在创建一个新项目(使用 IntelliJ IDEA),它将使用:
- Gradle 作为构建系统
- 用于构建脚本的 Kotlin DSL
- 用于“组织”的 Java 9 模块
- Kotlin 作为主要语言
我在设置 Gradle 以正确构建我的项目时遇到问题。我发现的大多数示例都是针对 Groovy 而不是 Kotlin DSL,并且大多数仅涵盖了我想要的一些功能,但不是全部。
现在我有两个模块,core和lib,其中core模块需要lib模块。我的 gradle 构建脚本是:
构建.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()
}
}
核心/build.gradle.kts
extra.set("moduleName", "myproject.core")
plugins {
kotlin("jvm")
}
dependencies {
compile(kotlin("stdlib"))
compile(project(":networking"))
}
库/build.gradle.kts
extra.set("moduleName", "myproject.lib")
plugins {
kotlin("jvm")
}
dependencies {
compile(kotlin("stdlib"))
}
这样做,配置失败:
配置项目 ':core' 时出现问题。
无法在额外属性扩展上获取属性“moduleName”,因为它不存在
如果我删除该inputs.property()
行配置成功,但核心编译失败(lib编译成功):
任务:core:compileKotlin
e: 在模块图中找不到模块 myproject.lib
我认为问题是我的根build.gradle.kts
,但我不知道如何使它工作。谷歌搜索,Gradle 的 Kotlin DSL 有点新,没有被广泛使用,文档也非常稀缺。
任何意见,将不胜感激!
解决方案
在发布问题后,我自然找到了解决方案。有一个 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 文件夹中,否则插件将无法检测到模块。
推荐阅读
- javascript - 我怎样才能让我的标题背景在滚动时变成白色?
- java - Apache Syncope 找不到指定的路径文件错误
- apache-nifi - 有没有办法禁用 NiFi 中的所有存储库(例如 FlowFile Repo、Content Repo 等)?
- numpy - 在 for 循环中数组大小的 Numpy 问题
- javascript - 如何修复此算法以在 AST 中创建嵌套部分
- flutter - Lottie 资产加载到网络上但在我的移动设备上
- angular - Ag-Grid 内部的模态渲染
- php - 如何确保 laravel 中的列名相同?
- javascript - MongoDb 聚合在 $group 中使用 $sortByCount
- wordpress - Wordpress 预约插件,让用户在预约时自己输入服务价格