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
相关产品推荐
相关产品推荐

