这是对Building a Kotlin + Java 9 project with Gradle的一种跟进。在链接的帖子中,使用了Gradle with 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;
}
问:如何让链接帖子中提供的解决方案(或任何其他解决方案)运行,以便使用Gradle的Kotlin DSL编译Kotlin项目可以使用Java 9/10环境?
发布于 2018-05-21 22:20:58
这是一种自我回答(我不完全理解这件事,所以解释可能不正确)。我在这里得出的结论纯粹是经验性的,是基于从Kotlin DSL到Gradle的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
任务使用一个空的类路径,并将模块路径作为编译器选项设置为主源集合( Kotlin源集,它也被添加为compileClasspath源集)的当前集合。
https://stackoverflow.com/questions/50437415
复制相似问题