Android问题记录 - Inconsistent JVM-target compatibility detected for tasks
文章目录
- 前言
- 开发环境
- 问题描述
- 问题分析
- 解决方案
- 补充内容
- 最后
前言
前段时间升级Android Studio后修复了一堆问题,详情请看:Android问题记录 - 适配Android Studio Ladybug/Java 21/AGP 8.0(持续更新)。我以为问题已经全部解决了,没想到时隔一个多月,在部署项目到新设备时又出现了新问题。
开发环境
- Flutter: 3.24.5
- Android Studio: 2024.2.1 Patch 3
- Java: 21.0.3
- Gradle: 8.5
- Android Gradle Plugin (AGP): 8.3.2
- Kotlin Gradle Plugin (KGP): 1.7.10
问题描述
项目构建运行后报错,部分报错日志如下:
e: /xxx/.gradle/caches/transforms-3/552b5fda311668ef6542358a30864490/transformed/jetified-kotlin-stdlib-1.9.24.jar!/META-INF/kotlin-stdlib-jdk7.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.9.0, expected version is 1.7.1.
...FAILURE: Build failed with an exception.* What went wrong:
Execution failed for task ':app:compileDebugKotlin'.
> A failure occurred while executing org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction> Compilation error. See log for more details
...┌─ Flutter Fix ──────────────────────────────────────────────────────────────────────────────────────────┐
│ [!] Your project requires a newer version of the Kotlin Gradle plugin. │
│ Find the latest version on https://kotlinlang.org/docs/releases.html#release-details, then update the │
│ version number of the plugin with id "org.jetbrains.kotlin.android" in the plugins block of │
│ /Users/xxx/android/settings.gradle. │
│ │
│ Alternatively (if your project was created before Flutter 3.19), update │
│ /Users/xxx/android/build.gradle │
│ ext.kotlin_version = '<latest-version>' │
└────────────────────────────────────────────────────────────────────────────────────────────────────────┘
问题分析
因为是Flutter项目,Flutter还贴心的给出了修复方法,升级Kotlin Gradle插件(KGP)。
先不急着升级,有一点很奇怪,在日常开发的电脑上运行是正常的。尝试将日常开发环境下的.gradle
打包压缩复制到出问题的电脑,结果还是不行。
只能先试试升级KGP版本,找到Android项目根目录下的settings.gradle
修改版本:
plugins {id "org.jetbrains.kotlin.android" version "1.9.24" apply false
}
如果你还在使用老的写法,找到Android项目根目录下的build.gradle
修改版本:
buildscript {ext.kotlin_version = '1.9.24'
}
这里补充一点,ext.kotlin_version
指定的是Kotlin编译器的版本,不过KGP和Kotlin共享相同的版本号(参考官方文档),所以实际上这个配置同时指定了KGP的版本,反之也是一样。
升级了KGP版本,需要升级Gradle或AGP的版本吗?通常是不需要的。以下是KGP对Gradle和AGP完全支持的最低以及最高版本范围:
参考文档:
- Configure a Gradle project
从表中可以看到,1.9.24
的KGP版本完全支持的Gradle版本是6.8.3–8.1.1
,完全支持的AGP版本是4.2.2–8.1.0
。当前项目的Gradle版本是8.5
,AGP版本是8.3.2
,这版本是不是都太高了?
是的,确实都高了。不过,这表中列出的是完全支持的版本范围,也就是兼容性最好的版本范围,不在这范围也是可以用的,只不过兼容性可能没那么好。如果需要追求更好的兼容性,将KGP版本升级到当前最新的2.1.0
也是可行的,不过不建议,因为第三方库可能还没适配会报错。
升级后重新运行出现新的报错:
Execution failed for task ':xxx:compileDebugKotlin'.
> Inconsistent JVM-target compatibility detected for tasks 'compileDebugJavaWithJavac' (1.8) and 'compileDebugKotlin' (21).
你可能遇到是类似这样的报错:
Execution failed for task ':xxx:compileDebugKotlin'.
> Inconsistent JVM-target compatibility detected for tasks 'compileDebugJavaWithJavac' (1.8) and 'compileDebugKotlin' (17).
报错中的compileDebugJavaWithJavac
后面跟的版本是由以下配置决定的,如果未配置默认是1.8
:
android {compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}
}
compileDebugKotlin
后面跟的版本是由以下配置决定的,如果未配置会由KGP决定,不同版本的KGP对jvmTarget
的默认值不同:
android {kotlinOptions {jvmTarget = "1.8"}
}
报错的依赖库只配置了compileOptions
,未配置kotlinOptions
,这导致两者的JVM版本不一致出现冲突。那为什么以前没报错呢?我猜测KGP之前的版本对jvmTarget
的默认值就是1.8
(未找到官方文档),所以KGP升级之前没有JVM版本不一致问题。
该怎么解决呢?尝试在Android项目根目录下的build.gradle
中增加以下内容统一设置kotlinOptions
:
subprojects {afterEvaluate {tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach { kotlinTask ->kotlinTask.kotlinOptions.jvmTarget = "1.8"}}
}
但这又会导致其他依赖库报错:
Execution failed for task ':xxx:compileDebugKotlin'.
> Inconsistent JVM-target compatibility detected for tasks 'compileDebugJavaWithJavac' (17) and 'compileDebugKotlin' (1.8).
有些依赖库在compileOptions
配置中指定了JavaVersion.VERSION_17
版本,统一设置kotlinOptions
后反而出现了冲突。继续优化一下,只对版本不一致的依赖库统一设置:
subprojects {afterEvaluate { project ->if (project.plugins.hasPlugin("com.android.application") || project.plugins.hasPlugin("com.android.library")) {tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach { kotlinTask ->def sourceCompatibility = project.android.compileOptions.sourceCompatibility?.toString() ?: "1.8"def jvmTarget = kotlinTask.kotlinOptions.jvmTarget ?: ""if (sourceCompatibility != jvmTarget) {kotlinTask.kotlinOptions.jvmTarget = sourceCompatibilityprintln "INFO: Updated jvmTarget for ${project.name} to ${sourceCompatibility}"}}}}
}
重新构建运行,一切正常!
解决方案
Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.9.0, expected version is 1.7.1.
请看前面的问题分析并升级Kotlin Gradle插件(KGP)版本解决。
Inconsistent JVM-target compatibility detected for tasks 'compileDebugJavaWithJavac' (1.8) and 'compileDebugKotlin' (21).
在Android项目根目录下的build.gradle
中增加以下内容解决:
subprojects {afterEvaluate { project ->if (project.plugins.hasPlugin("com.android.application") || project.plugins.hasPlugin("com.android.library")) {tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach { kotlinTask ->def sourceCompatibility = project.android.compileOptions.sourceCompatibility?.toString() ?: "1.8"def jvmTarget = kotlinTask.kotlinOptions.jvmTarget ?: ""if (sourceCompatibility != jvmTarget) {kotlinTask.kotlinOptions.jvmTarget = sourceCompatibilityprintln "INFO: Updated jvmTarget for ${project.name} to ${sourceCompatibility}"}}}}
}
补充内容
- 如果是Flutter项目遇到以下报错,通常是因为下载指定的Gradle版本失败导致的。可以尝试用Android Studio单独打开Flutter项目下的Android项目并执行
Gradle Sync
解决。
Exception in thread "main" java.til.zip.ZipException: zip END header not foundat java.base/java.util.zip.ZipFile$Source.findEND(Unknown Source)at java.base/java.util.zip.ZipFile$Source.initCEN(Unknown Source)at java.base/java.util.zip.ZipFile$Source.<init>(Unknown Source)at java.base/java.util.zip.ZipFile$Source.get(Unknown Source)at java.base/java.util.zip.ZipFile$CleanableResource.<init>(Unknown Source)at java.base/java.util.zip.ZipFile.<init>(Unknown Source)at java.base/java.util.zip.ZipFile.<init>(Unknown Source)at java.base/java.util.zip.ZipFile.<init>(Unknown Source)at org.gradle.wrapper.Install.unzip(Install.java:214)at org.gradle.wrapper.Install.access$600(Install.java:27)at org.gradle.wrapper.Install$1.call(Install.java:74)at org.gradle.wrapper.Install$1.call(Install.java:48)at org.gradle.wrapper.ExclusiveFileAccessManager.access(ExclusiveFileAccessManager.java:65)...
- 如果是Flutter项目遇到以下报错,可能是因为Gradle版本太低导致的,可以尝试升级Gradle版本解决。
Warning: Flutter was unable to detect project Gradle, Java, AGP, and KGP versions. Skipping dependency version checking. Error was: org.gradle.internal.exceptions.LocationAwareException: Script '/xxx/flutter/packages/flutter_tools/gradle/src/main/kotlin/dependency_version_checker.gradle.kts' line: 1
Failed to load compiled script from classpath [/xxx/.gradle/caches/8.5/kotlin-dsl/scripts/da5f7ca28e610c6354c26e9549dbcb59/classes->/xxx/.gradle/caches/jars-9/fb6235f7ef58bafc318ce2cbd09edaf5/classes.jar, /xxx/.gradle/caches/8.5/kotlin-dsl/accessors/3d3fa6fe1c82cb5e6a478c18364a3a05-PS/classes].
最后
如果这篇文章对你有所帮助,点赞👍收藏🌟支持一下吧,谢谢~
本篇文章由@crasowas发布于CSDN。
相关文章:

Android问题记录 - Inconsistent JVM-target compatibility detected for tasks
文章目录 前言开发环境问题描述问题分析解决方案补充内容最后 前言 前段时间升级Android Studio后修复了一堆问题,详情请看:Android问题记录 - 适配Android Studio Ladybug/Java 21/AGP 8.0(持续更新)。我以为问题已经全部解决了…...
ejb组件(rmi) webservice平台(xml)
springboot bean 在 Spring Boot 中,Bean 是 Spring 框架的核心概念之一,表示由 Spring 容器管理的对象。通过 Bean 或其他注解(如 Component、Service、Repository 等)来定义和管理这些对象。以下是关于 Spring Boot 中 Bean 的…...
【jvm】垃圾回收的重点区域
目录 1. 说明2. 堆(Heap)3. 方法区(Method Area) 1. 说明 1.JVM(Java Virtual Machine)垃圾回收的重点区域主要集中在堆(Heap)和方法区(Method Area)。2.堆是…...

PyQt信号槽实现页面的登录与跳转 #页面进一步优化
将登录框中的取消按钮使用信号和槽的机制,关闭界面。 将登录按钮使用信号和槽连接到自定义的槽函数中,在槽函数中判断ui界面上输入的账号是否为"admin",密码是否为"123456",如果账号密码匹配成功,当前界面关…...
谈谈web3
全面解析 Web3:未来互联网的革命性进程 引言:互联网进化的三部曲 互联网的发展经历了三个重要阶段,每一个阶段都深刻地改变了我们的生活方式: Web1(1990-2005):静态互联网时代,人…...
正则表达式实战例子
正则表达式实战例子 1. 验证电子邮件地址 定义一个合理的电子邮件格式,并检查给定的字符串是否符合这个模式。 import redef is_valid_email(email):# 定义电子邮件格式的正则表达式pattern r^[a-zA-Z0-9_.-][a-zA-Z0-9-]\.[a-zA-Z0-9-.]$return bool(re.match(…...
Hadoop不同版本的区别
免费springboot,vue,springcloudalibaba视频,有兴趣可以看看 <!-- springboot,springboot整合redis,整合rocketmq视频: --> https://www.bilibili.com/video/BV1nkmRYSErk/?vd_source14d27ec13a473…...

QtCreator UI界面 菜单栏无法输入中文
如下图红色所示的区域,直接输入是无法输入中文的: 解决方法:在右边的属性值里输入即可 也可以参考这位同学的解决方法:友情链接...

java switch及其新特性
switch是什么 在Java中,switch语句是一种多分支选择结构,它允许程序根据一个表达式的值从多个代码块中选择执行哪一个。switch语句通常比多个if-else语句更清晰、更易读。 Java switch语句的基本语法: switch (expression) {case value1:/…...
E卷-货币单位换算(100分)
货币单位换算 问题描述 在一个多国货币记账本中,记录了若干条不同货币的金额。现在需要将这些金额全部转换成人民币分(fen),并进行汇总。每条记录可能包含单独的元、单独的分,或者元与分的组合。转换时,需要考虑不同货币之间的汇率关系。 要求将这些货币全部换算成人民…...

什么是MMD Maximum Mean Discrepancy 最大均值差异?
9多次在迁移学习看到了,居然还是Bernhard Schlkopf大佬的论文,仔细看看。 一.什么是MMD? 1. MMD要做什么? 判断两个样本(族)是不是来自于同一分布 2.怎么做?(直观上)…...

沐风老师3DMAX摄相机阵列插件使用方法
3DMAX摄相机阵列插件,从网格对象或样条线的顶点法线快速创建摄相机阵列。该插件从网格的顶点或样条线的节点获取每个摄影机的位置和方向。 3DMAX摄相机阵列插件支持目前3dMax主流的物理相机、标准相机、VRay物理相机。 【版本要求】 3dMax 2015及更高版本 【安装方…...
Java Web 开发学习中:过滤器与 Ajax 异步请求
一、过滤器 Filter: 过滤器的概念与用途 在一个庞大的 Web 应用中,有许多资源需要受到保护或进行特定的预处理。过滤器就像是一位智能的守卫,站在资源的入口处,根据预先设定的规则,决定哪些请求可以顺利访问资源&…...

数据结构 (36)各种排序方法的综合比较
一、常见排序方法分类 插入排序类 直接插入排序:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。希尔排序:是插入排序的一种改进版本,先将整个待排序的记录序列分割成为…...

使用vue搭建不需要打包的前端项目
需求详情:用户不要项目进行打包,开发还是选用vue2,且需要便于上手 项目目录 >api 存放api.js,主要是前端用到的接口 >css >>>fonts 存放页面需要的字体文件 >>>1.css 存放所有css文件 >data 存放echarts…...
发布订阅者=>fiber=>虚拟dom
文章目录 vue的响应式原理-发布订阅者模式vue3 响应式原理及优化fiberfiber 与 虚拟dom vue的响应式原理-发布订阅者模式 Vue响应式原理概述 Vue.js的响应式原理是其核心特性之一。它使得当数据发生变化时,与之绑定的DOM元素能够自动更新。其主要基于数据劫持和发布…...
Python-计算机中的码制以及基础运算符(用于分析内存)
记录python学习,直到学会基本的爬虫,使用python搭建接口自动化测试就算学会了,在进阶webui自动化,app自动化 python基础2-码制 计算机中的码制原码(True Form)反码(Ones Complement)…...

yum 离线软件安装
适用范围 支持YUM软件管理的操作系统: 银河麒麟 服务器操作系统V10统信服务器操作系统V20CentOS 系列 准备 准备一台可以连接互联网并且与离线安装的操作系统相同版本的操作系统,包括指令集类型相同。 安装下载工具 查询是否已经安装下载工具 yum…...

【C语言】17. 数据在内存中的存储
文章目录 一、整数在内存中的存储二、⼤⼩端字节序和字节序判断1、什么是⼤⼩端?2、为什么有⼤⼩端?3、练习1)练习12)练习23)练习34)练习45) 练习56)练习6 三、浮点数在内存中的存储1、浮点数的…...

二叉树概述
目录 一、二叉树的基本结构 二、二叉树的遍历 1.前序 2.中序 3.后序 4.层序遍历 三.计算二叉树的相关参数 1.计算节点总个数 2.计算叶子节点的个数 3.计算树的高度 4.计算第k层的子树个数 5.查找树中val为x的节点 四.刷题 1.单值二叉树 2.检查两棵树是否相同 3.一…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...

技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...

DBLP数据库是什么?
DBLP(Digital Bibliography & Library Project)Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高,数据库文献更新速度很快,很好地反映了国际计算机科学学术研…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG
TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码:HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...