如何解决Flutter项目编译时Java版本与Gradle版本不兼容的问题

问题报错

这类问题一般都有类似这样的报错信息:

image-20250712223819909

反正我是遇到这个报错很多次了,看得眼烦心烦,但是每次迫于项目的截止时间,没有仔细研究过这个问题究竟是如何产生的,基本都是网上胡乱搜一波解决方案然后顶着一堆warnings跑项目,今天彻底来解决一下这个问题

问题原因

上面的错误提示很明显,就是我们的项目使用的gradle版本与当前Flutter使用的Java版本不兼容,然而,上面引起报错的项目是用Flutter CLI工具创建的空白项目,Flutter工具本身有问题这个可能性是很小的,也不要想着去修改生成出来的项目的gradle版本了,否则就算项目跑起来了也会有一堆warnings。那么应该如何解决呢?

解决之法

既然是gradle版本与Flutter使用的Java版本不兼容,那么我们可以尝试更改当前Flutter使用的Java版本。

当前Flutter使用的Java版本如何查看呢?在你的Flutter项目的根目录使用如下命令:

1
flutter analyze --suggestions

对于上面的项目,输出结果:

image-20250712224551741

再次提醒,flutter analyze --suggestions命令只在某个Flutter项目的根目录下可用,如果你尝试在其他无关目录使用这个命令会得到以下输出:

image-20250712224656014

显示找不到App名称

可以看到,根据这个命令的输出,我们发现,Flutter使用的Java版本是21.0.7,同时我们还可以看到本项目当前使用的Gradle版本是7.6.3,查阅Gradle官方的Java兼容性表

image-20250712224920632

我们发现,7.6版本的Gradle兼容性应当在JDK19及以下,我们这里使用的JDK 21.0.7自然就是不兼容了,我们可以使用如下命令来更换Flutter使用的JDK版本:

1
flutter config --jdk-dir '/path/to/target_jdk_home' # 这里填写兼容的jdk所在路径,请自行安装,推荐使用jdk17

注意,--jdk-dir参数的值是java home的位置,而非java可执行文件的位置

配置完毕后,重启vscode或者关闭原先的vscode内置终端再打开一个新终端,更改即可生效,这时再次尝试运行,发现不会再报刚才的错了。

以后?

如果你只是急于解决问题,你就可以退出本文了,为了完整性,接下来将介绍一下上述配置的原理,以及从此问题出发,介绍一些管理多Flutter版本和多JDK版本的方法,这样后续再遇到类似的问题就不会不知所措了。

原理

Flutter在编译项目时,会尝试从以下这几个目录按顺序查找JDK:

  1. 当前Android Studio所使用的JDK版本
  2. JAVA_HOME环境变量
  3. 系统环境变量PATH

详见Flutter源码中查找JDK的部分

一旦找到一个Java版本,即使不兼容当前Gradle,也不会再继续查找。

大部分坑都是因为Android Studio引起的,因为Android Studio使用的Java版本一般都比较前卫,你看看最新的Android Studio使用的Gradle版本和最新的Flutter使用的Gradle版本的差距就知道了。

Flutter多版本管理

多版本Flutter的管理相信不会有疑问,选择fvm就对了,唯一的缺点就是执行Flutter命令的时候都得使用fvm flutter,但是其带来的方便性完全可以抵消这一点不便,甚至你还可以在shell的rc文件中写一个别名,例如在.zshrc中:

1
alias flutter="fvm flutter"

这样就不用多输入一个fvm了

fvm官网

使用fvm管理Flutter版本可能会遇到一些问题,例如一些CLI工具找不到dartflutter命令等(即使你按照上面的的步骤设置了alias也会提示找不到命令),如果有遇到这类问题请参阅:使用fvm导致一些CLI工具无法找到flutter命令的解决方案

vscode中的Flutter版本管理

在vscode中,Flutter版本是通过vscode中的设置确定的,作为我们平时开发Flutter应用经常使用的IDE,还是要熟悉它的Flutter版本使用机制。

首先打开Vscode的设置,或者按快捷键command + ,,在设置搜索框中搜索"flutter sdk",可以看到两个相关的设置项:

image-20250713003513738

第一个设置项直接指定使用的Flutter SDK所在的目录,我们还可以从设置的说明中看出,vscode会从以下地方依次寻找Flutter SDK:

  1. 当前项目所在目录
  2. 环境变量FLUTTER_ROOT所指定的Flutter目录
  3. PATH环境变量

第二个设置则是给VSCode指明一个存放所有Flutter SDK的路径,设定了这个设置项后,我们就可以在Flutter项目中,使用快捷键command + shift + P然后输入Flutter: Change SDK命令来快速切换当前项目所使用的Flutter SDK版本了:

image-20250713004606768

Java的多版本管理

jenv是一个Java的版本管理器,适用于Linux/macOS,这个工具本身不提供JDK的下载,只是用户手动添加JDK的路径,然后它将会帮你管理起来,支持项目级、全局、shell级的JDK版本设定

Windows用户可以使用jabba,这是一个跨平台的JDK多版本管理工具,Linux和macOS也可用。但个人使用下来,还是感觉jenv更加方便,而且每个添加给jenv进行管理的JDK路径信息都可以通过jenv命令查看,手动添加JDK进行管理的方式也让心里不用操心这个工具究竟把JDK安装在哪儿了。


如何解决Flutter项目编译时Java版本与Gradle版本不兼容的问题
http://47.109.28.82/2025/07/12/如何解决Flutter项目编译时Java版本与Gradle版本不兼容的问题/
作者
GraftCopolymer
发布于
2025年7月12日
许可协议