如何创建含kotlinx-datetime的Kotlin项目并跨不同JVM共享
Execution failed for task ':app:mergeDebugJavaResource'.
A failure occurred while executing com.android.build.gradle.internal.tasks.MergeJavaResWorkAction
2 files found with path 'META-INF/versions/9/previous-compilation-data.bin' from inputs:
- C:...\kotlinx-datetime-jvm\0.4.1...\kotlinx-datetime-jvm-0.4.1.jar
- C:...\org.jetbrains.kotlinx\atomicfu-jvm\0.22.0...\atomicfu-jvm-0.22.0.jar
先解决上述资源合并冲突错误
这个错误源于多个依赖包包含了相同路径的Kotlin编译元数据文件,Android打包时无法合并重复资源。只需在Android项目的构建脚本中添加排除规则即可:
Groovy 语法(build.gradle)
android { packagingOptions { exclude 'META-INF/versions/9/previous-compilation-data.bin' } }
Kotlin DSL 语法(build.gradle.kts)
android { packagingOptions { exclude("META-INF/versions/9/previous-compilation-data.bin") } }
这类文件是Kotlin编译器的缓存数据,运行时不需要,排除后不会影响kotlinx-datetime或atomicfu的核心功能。
问题1:正确配置使用org.jetbrains.kotlinx:kotlinx-datetime:0.4.1的Kotlin项目
kotlinx-datetime 0.4.1要求Kotlin版本≥1.6.0,需根据项目类型做对应配置:
1. 基础Kotlin/JVM项目(非Android)
在模块的构建脚本中指定Kotlin版本、JVM工具链版本,并引入依赖:
Groovy 语法
plugins { id 'org.jetbrains.kotlin.jvm' version '1.6.21' } repositories { mavenCentral() } dependencies { // 仅当前模块使用用implementation;需暴露给上层模块用api implementation 'org.jetbrains.kotlinx:kotlinx-datetime:0.4.1' } kotlin { jvmToolchain(11) // 根据项目需求设置JVM版本,如8、11、17等 }
Kotlin DSL 语法
plugins { kotlin("jvm") version "1.6.21" } repositories { mavenCentral() } dependencies { implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.4.1") } kotlin { jvmToolchain(11) }
2. Android项目
除依赖配置外,需对齐Android编译选项与JVM版本:
android { compileSdk 33 defaultConfig { minSdk 21 targetSdk 33 } compileOptions { sourceCompatibility JavaVersion.VERSION_11 targetCompatibility JavaVersion.VERSION_11 } kotlinOptions { jvmTarget = "11" } } dependencies { implementation 'org.jetbrains.kotlinx:kotlinx-datetime:0.4.1' }
问题2:跨不同JVM要求的项目共享的最佳实践
核心思路是隔离编译环境、统一依赖版本,推荐以下方案:
1. 抽离共享模块
将依赖kotlinx-datetime的业务逻辑抽成独立的Kotlin/JVM模块,该模块使用两个项目的最低兼容JVM版本(比如项目A用JVM 8、项目B用JVM 11,共享模块设为JVM 8),两个项目分别引用该模块:
root-project/ ├── shared-module/ # 依赖kotlinx-datetime 0.4.1,JVM版本设为最低兼容值 ├── jvm-project/ # JVM版本11,引用shared-module └── android-project/ # 对应JVM版本8,引用shared-module
共享模块只需配置一次依赖,两个项目各自处理自身的JVM编译环境,互不干扰。
2. 统一依赖版本管理
在根项目构建脚本中定义版本变量,确保所有模块使用同一版本的kotlinx-datetime:
Groovy 语法(根build.gradle)
ext { kotlinxDatetimeVersion = "0.4.1" kotlinVersion = "1.6.21" }
模块中引用:
dependencies { implementation "org.jetbrains.kotlinx:kotlinx-datetime:$kotlinxDatetimeVersion" }
Kotlin DSL 语法(根settings.gradle.kts)
dependencyResolutionManagement { versionCatalogs { create("libs") { library("kotlinx-datetime", "org.jetbrains.kotlinx", "kotlinx-datetime").version("0.4.1") library("kotlin-jvm", "org.jetbrains.kotlin", "kotlin-stdlib-jdk8").version("1.6.21") } } }
模块中引用:
dependencies { implementation(libs.kotlinx.datetime) }
3. 强制统一冲突依赖
若两个项目的其他依赖带来版本冲突,可在根项目中强制指定版本:
Groovy 语法
allprojects { configurations.all { resolutionStrategy { force 'org.jetbrains.kotlinx:kotlinx-datetime:0.4.1' force 'org.jetbrains.kotlinx:atomicfu-jvm:0.22.0' } } }
Kotlin DSL 语法
allprojects { configurations.all { resolutionStrategy { force("org.jetbrains.kotlinx:kotlinx-datetime:0.4.1") force("org.jetbrains.kotlinx:atomicfu-jvm:0.22.0") } } }
内容的提问来源于stack exchange,提问作者Daniel Machnik

