当前位置: 首页 > news >正文

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完全支持的最低以及最高版本范围:

screenshot1

参考文档:

  • 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}"}}}}
}

重新构建运行,一切正常!

解决方案

  1. 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)版本解决。

  1. 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}"}}}}
}

补充内容

  1. 如果是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)...
  1. 如果是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后修复了一堆问题&#xff0c;详情请看&#xff1a;Android问题记录 - 适配Android Studio Ladybug/Java 21/AGP 8.0&#xff08;持续更新&#xff09;。我以为问题已经全部解决了…...

ejb组件(rmi) webservice平台(xml)

springboot bean 在 Spring Boot 中&#xff0c;Bean 是 Spring 框架的核心概念之一&#xff0c;表示由 Spring 容器管理的对象。通过 Bean 或其他注解&#xff08;如 Component、Service、Repository 等&#xff09;来定义和管理这些对象。以下是关于 Spring Boot 中 Bean 的…...

【jvm】垃圾回收的重点区域

目录 1. 说明2. 堆&#xff08;Heap&#xff09;3. 方法区&#xff08;Method Area&#xff09; 1. 说明 1.JVM&#xff08;Java Virtual Machine&#xff09;垃圾回收的重点区域主要集中在堆&#xff08;Heap&#xff09;和方法区&#xff08;Method Area&#xff09;。2.堆是…...

PyQt信号槽实现页面的登录与跳转 #页面进一步优化

将登录框中的取消按钮使用信号和槽的机制&#xff0c;关闭界面。 将登录按钮使用信号和槽连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是否为"123456",如果账号密码匹配成功&#xff0c;当前界面关…...

谈谈web3

全面解析 Web3&#xff1a;未来互联网的革命性进程 引言&#xff1a;互联网进化的三部曲 互联网的发展经历了三个重要阶段&#xff0c;每一个阶段都深刻地改变了我们的生活方式&#xff1a; Web1&#xff08;1990-2005&#xff09;&#xff1a;静态互联网时代&#xff0c;人…...

正则表达式实战例子

正则表达式实战例子 1. 验证电子邮件地址 定义一个合理的电子邮件格式&#xff0c;并检查给定的字符串是否符合这个模式。 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&#xff0c;vue&#xff0c;springcloudalibaba视频&#xff0c;有兴趣可以看看 <!-- springboot&#xff0c;springboot整合redis&#xff0c;整合rocketmq视频&#xff1a; --> https://www.bilibili.com/video/BV1nkmRYSErk/?vd_source14d27ec13a473…...

QtCreator UI界面 菜单栏无法输入中文

如下图红色所示的区域&#xff0c;直接输入是无法输入中文的&#xff1a; 解决方法&#xff1a;在右边的属性值里输入即可 也可以参考这位同学的解决方法&#xff1a;友情链接...

java switch及其新特性

switch是什么 在Java中&#xff0c;switch语句是一种多分支选择结构&#xff0c;它允许程序根据一个表达式的值从多个代码块中选择执行哪一个。switch语句通常比多个if-else语句更清晰、更易读。 Java switch语句的基本语法&#xff1a; switch (expression) {case value1:/…...

E卷-货币单位换算(100分)

货币单位换算 问题描述 在一个多国货币记账本中,记录了若干条不同货币的金额。现在需要将这些金额全部转换成人民币分(fen),并进行汇总。每条记录可能包含单独的元、单独的分,或者元与分的组合。转换时,需要考虑不同货币之间的汇率关系。 要求将这些货币全部换算成人民…...

什么是MMD Maximum Mean Discrepancy 最大均值差异?

9多次在迁移学习看到了&#xff0c;居然还是Bernhard Schlkopf大佬的论文&#xff0c;仔细看看。 一.什么是MMD&#xff1f; 1. MMD要做什么&#xff1f; 判断两个样本&#xff08;族&#xff09;是不是来自于同一分布 2.怎么做&#xff1f;&#xff08;直观上&#xff09;…...

沐风老师3DMAX摄相机阵列插件使用方法

3DMAX摄相机阵列插件&#xff0c;从网格对象或样条线的顶点法线快速创建摄相机阵列。该插件从网格的顶点或样条线的节点获取每个摄影机的位置和方向。 3DMAX摄相机阵列插件支持目前3dMax主流的物理相机、标准相机、VRay物理相机。 【版本要求】 3dMax 2015及更高版本 【安装方…...

Java Web 开发学习中:过滤器与 Ajax 异步请求

一、过滤器 Filter&#xff1a; 过滤器的概念与用途 在一个庞大的 Web 应用中&#xff0c;有许多资源需要受到保护或进行特定的预处理。过滤器就像是一位智能的守卫&#xff0c;站在资源的入口处&#xff0c;根据预先设定的规则&#xff0c;决定哪些请求可以顺利访问资源&…...

数据结构 (36)各种排序方法的综合比较

一、常见排序方法分类 插入排序类 直接插入排序&#xff1a;通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。希尔排序&#xff1a;是插入排序的一种改进版本&#xff0c;先将整个待排序的记录序列分割成为…...

使用vue搭建不需要打包的前端项目

需求详情&#xff1a;用户不要项目进行打包&#xff0c;开发还是选用vue2,且需要便于上手 项目目录 >api 存放api.js&#xff0c;主要是前端用到的接口 >css >>>fonts 存放页面需要的字体文件 >>>1.css 存放所有css文件 >data 存放echarts…...

发布订阅者=>fiber=>虚拟dom

文章目录 vue的响应式原理-发布订阅者模式vue3 响应式原理及优化fiberfiber 与 虚拟dom vue的响应式原理-发布订阅者模式 Vue响应式原理概述 Vue.js的响应式原理是其核心特性之一。它使得当数据发生变化时&#xff0c;与之绑定的DOM元素能够自动更新。其主要基于数据劫持和发布…...

Python-计算机中的码制以及基础运算符(用于分析内存)

记录python学习&#xff0c;直到学会基本的爬虫&#xff0c;使用python搭建接口自动化测试就算学会了&#xff0c;在进阶webui自动化&#xff0c;app自动化 python基础2-码制 计算机中的码制原码&#xff08;True Form&#xff09;反码&#xff08;Ones Complement&#xff09…...

yum 离线软件安装

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

【C语言】17. 数据在内存中的存储

文章目录 一、整数在内存中的存储二、⼤⼩端字节序和字节序判断1、什么是⼤⼩端&#xff1f;2、为什么有⼤⼩端?3、练习1&#xff09;练习12&#xff09;练习23&#xff09;练习34&#xff09;练习45&#xff09; 练习56&#xff09;练习6 三、浮点数在内存中的存储1、浮点数的…...

二叉树概述

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

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...