gpt4 book ai didi

gradle - 使用 Java 9/10 和 Gradle 的 Kotlin DSL 构建 Gradle Kotlin 项目

转载 作者:行者123 更新时间:2023-12-02 00:13:10 25 4
gpt4 key购买 nike

这是 Building a Kotlin + Java 9 project with Gradle 的后续行动。在链接的帖子中,使用了 Gradle 和 Groovy。在我的例子中,使用了 Kotlin DSL。

基本上我有一个具有以下结构的gradle项目(此处仅相关内容):

src/
| main/
| | kotlin/
| | | com/example/testproject/
| | | | Main.kt
| | | module-info.java
build.gradle.kts
settings.gradle

通常我会在其上运行 gradle run,但这会导致以下错误:

module-info.java:3: error: module not found: kotlin.stdlib
requires kotlin.stdlib;

现在这就是我的构建文件当前的样子

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

buildscript {
var kotlin_version: String by extra
kotlin_version = "1.2.41"

repositories {
mavenCentral()
}
dependencies {
classpath(kotlin("gradle-plugin", kotlin_version))
}
}

repositories {
mavenCentral()
}

plugins {
kotlin("jvm") version "1.2.41"
application
}

val kotlin_version: String by extra

dependencies {
implementation(kotlin("stdlib", kotlin_version))
implementation(kotlin("stdlib-jdk8", kotlin_version))
implementation(kotlin("runtime", kotlin_version))
implementation(kotlin("reflect", kotlin_version))
}

val group = "com.example"
application {
mainClassName = "$group.testproject.Main"
}

java {
sourceCompatibility = JavaVersion.VERSION_1_10
targetCompatibility = sourceCompatibility
sourceSets {
"main" {
java.srcDirs("src/main/kotlin")
}
}
}

tasks.withType<KotlinCompile> {
kotlinOptions.jvmTarget = "1.8"
}

这是我的 module-info.java:

module com.example.testproject {
// Kotlin compatibility
requires kotlin.stdlib;
exports com.example.testproject;
}

问题:如何运行链接帖子中提供的解决方案(或任何其他解决方案),以便可以使用 Java 9/10 环境编译具有 Gradle 的 Kotlin DSL 的 Kotlin 项目?

最佳答案

这是一种 self 回答(我不完全理解这一点,所以解释可能不正确)。我在这里得出的结论纯粹是经验性的,并且基于从 Kotlin DSL 到 Gradle's Groovy 的相互转换。

我遇到的第一个问题是 Kotlin 函数有两个相互冲突的提供者:

  implementation(kotlin("stdlib", kotlin_version))
implementation(kotlin("runtime", kotlin_version))

我决定使用 stdlib 解决了这个问题。所有其他依赖项彼此不冲突。

更严重的问题有所不同:compileJava 任务没有找到正确的类(来自项目)和模块(来自发行版)。因此我需要调整路径,如下例所示:

val compileKotlin: KotlinCompile by tasks
val compileJava: JavaCompile by tasks
compileJava.destinationDir = compileKotlin.destinationDir

这基本上会在 Kotlins 编译输出中编译 Java 类,并使 Java 从项目中找到类。

最后一个问题最终可以通过以下非惯用的 Kotlin 脚本来解决:

tasks {
"compileJava" {
dependsOn(":compileKotlin")
if (JavaVersion.current() >= JavaVersion.VERSION_1_9) {
inputs.property("moduleName", ext["moduleName"])
doFirst {
compileJava.options.compilerArgs = listOf(
// include Gradle dependencies as modules
"--module-path", java.sourceSets["main"].compileClasspath.asPath,
)
java.sourceSets["main"].compileClasspath = files()
}
}
}
}

这基本上让 compileJava 任务使用空类路径,并将模块路径设置为主源集当前设置的compileClasspath(Kotlin 源集也添加为 Java 源集)的编译器选项)。

关于gradle - 使用 Java 9/10 和 Gradle 的 Kotlin DSL 构建 Gradle Kotlin 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50437415/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com