【发布时间】:2021-08-23 15:06:02
【问题描述】:
长话短说:我想为我的一个仅限 kotlin 的库发布 jdk8 复古兼容性的变体。
这是一个渴望已久的功能,我在很长一段时间以来一直在尝试解决它,但一直没有做好。然而,经过对 Gradle Slack 的多次尝试和帮助,我认为我已经很接近了,但我仍然有一个错误,我似乎无法摆脱。
想法是使用 jdk11 编译主版本(src/main 和 scr/jpms,后者仅包含 module-info.class),而 src/main 的 jdk8 变体当然只使用 jdk8 编译.
这是我目前的build.gradle.kts:
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
kotlin("jvm") version "1.5.10"
`java-library`
`maven-publish`
}
group = "kotlin.graphics"
version = "3.3.1"
repositories {
mavenCentral()
}
dependencies {
implementation(kotlin("stdlib-jdk8"))
testImplementation("io.kotest:kotest-runner-junit5:4.4.1")
testImplementation("io.kotest:kotest-assertions-core:4.4.1")
}
val jdk8 = sourceSets.create("jdk8") {
java.srcDir("src/main/java")
kotlin.srcDir("src/main/kotlin")
}
val jdk11 = sourceSets["main"].apply {
java.srcDir("src/jpms/java")
}
java.registerFeature("jdk8") {
usingSourceSet(jdk8)
capability("group", "name", "0.1")
}
configureCompileVersion(jdk8, 8)
configureCompileVersion(jdk11, 11)
val moduleName = "$group.$name"
fun configureCompileVersion(set: SourceSet, jdkVersion: Int) {
val compiler = project.javaToolchains.compilerFor {
languageVersion.set(JavaLanguageVersion.of(jdkVersion))
}.get()
val target = if (jdkVersion == 8) "1.8" else jdkVersion.toString()
tasks {
named<KotlinCompile>(set.compileKotlinTaskName) {
kotlinOptions {
jvmTarget = target
jdkHome = compiler.metadata.installationPath.asFile.absolutePath
}
source = sourceSets.main.get().kotlin
}
named<JavaCompile>(set.compileJavaTaskName) {
targetCompatibility = target
sourceCompatibility = target
modularity.inferModulePath.set(jdkVersion >= 9)
javaCompiler.set(compiler)
source = sourceSets.main.get().allJava + set.allJava
if (jdkVersion >= 9)
options.compilerArgs = listOf("--patch-module", "$moduleName=${set.output.asPath}")
}
}
}
val SourceSet.compileKotlinTaskName: String
get() = getCompileTaskName("kotlin")
val SourceSet.kotlin: SourceDirectorySet
get() = withConvention(KotlinSourceSet::class) { kotlin }
publishing {
publications {
create<MavenPublication>("maven") {
groupId = "org.gradle.sample"
artifactId = "library"
version = "1.1"
from(components["java"])
}
}
repositories.maven {
name = "prova"
url = uri("repo")
}
}
如果我运行:assemble,则生成的工件将使用 jdk11 正确编译。
直到一切都如预期的那样。
但如果我尝试发布,我会得到:
任务:compileJdk8Kotlin FAILED 5 个可操作的任务:1 个已执行,4 个是最新的 e: 在模块图中找不到模块 java.base
由于某些原因,Gradle 似乎尝试使用 jpms 编译 jdk8 变体,尽管它应该被自动禁用。我尝试手动打开和关闭它:
modularity.inferModulePath.set(jdkVersion >= 9)
但它也没有工作。
项目是here
Gradle 7.1.1
【问题讨论】:
标签: kotlin gradle build.gradle gradle-kotlin-dsl java-platform-module-system