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

如何创建含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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 11:17:57