You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gradle如何为Kotlin库发布JDK8兼容变体并解决编译报错问题

问题根源

报错核心是Kotlin编译器编译JDK8变体时,检测到项目中存在module-info.java自动开启了JPMS模块编译模式,而JDK8本身不支持模块系统,导致无法找到java.base模块。你之前仅对Java编译任务禁用了模块路径推断,没有覆盖Kotlin编译任务的配置,同时存在源码引入冗余的问题。

具体修改方案

1. 修正Kotlin编译任务配置

在JDK8变体的Kotlin编译任务中添加参数,强制禁用模块路径,使用传统类路径模式,同时移除冗余的源码赋值(创建jdk8源集时已经指定了源码路径,不需要重复赋值)。

2. 修正Java编译任务的源码引入

JDK8编译时不要引入main源集下的jpms目录内容,避免把module-info.java加入JDK8的编译队列。

3. 修正Feature Capability配置

注册jdk8特性时使用实际的项目坐标,保证发布时变体识别正确。

4. 修正发布配置的硬编码值

把发布配置里的测试坐标替换为项目实际配置。

完整修改后的关键代码段

// 创建jdk8源集时添加排除规则,避免误引入module-info
val jdk8 = sourceSets.create("jdk8") {
    java.srcDir("src/main/java")
    kotlin.srcDir("src/main/kotlin")
    resources.srcDir(sourceSets.main.get().resources.srcDirs)
    java.exclude("module-info.java")
}

val jdk11 = sourceSets["main"].apply {
    java.srcDir("src/jpms/java")
}

java.registerFeature("jdk8") {
    usingSourceSet(jdk8)
    // 使用项目实际坐标
    capability(project.group.toString(), project.name, project.version.toString())
}

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
                // JDK8编译时强制禁用模块路径
                if (jdkVersion == 8) {
                    freeCompilerArgs += "-Xuse-module-path=false"
                }
            }
        }
        named<JavaCompile>(set.compileJavaTaskName) {
            targetCompatibility = target
            sourceCompatibility = target
            modularity.inferModulePath.set(jdkVersion >= 9)
            javaCompiler.set(compiler)
            // 区分JDK版本引入源码,JDK8不要引入main源集的jpms内容
            source = if (jdkVersion >= 9) {
                sourceSets.main.get().allJava + set.allJava
            } else {
                set.allJava
            }
            if (jdkVersion >= 9) {
                options.compilerArgs = listOf("--patch-module", "$moduleName=${set.output.asPath}")
            }
        }
    }
}

// 发布配置修正
publishing {
    publications {
        create<MavenPublication>("maven") {
            from(components["java"])
            groupId = project.group.toString()
            artifactId = project.name
            version = project.version.toString()
        }
    }
    repositories.maven {
        name = "prova"
        url = uri("repo")
    }
}

修改后重新执行发布任务即可正常编译JDK8变体。

内容的提问来源于stack exchange,提问作者elect

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 23:12:03