如何解决Flutter项目编译时Java版本与Gradle版本不兼容的问题
问题报错
这类问题一般都有类似这样的报错信息:
反正我是遇到这个报错很多次了,看得眼烦心烦,但是每次迫于项目的截止时间,没有仔细研究过这个问题究竟是如何产生的,基本都是网上胡乱搜一波解决方案然后顶着一堆warnings跑项目,今天彻底来解决一下这个问题
问题原因
上面的错误提示很明显,就是我们的项目使用的gradle版本与当前Flutter使用的Java版本不兼容,然而,上面引起报错的项目是用Flutter CLI工具创建的空白项目,Flutter工具本身有问题这个可能性是很小的,也不要想着去修改生成出来的项目的gradle版本了,否则就算项目跑起来了也会有一堆warnings。那么应该如何解决呢?
解决之法
既然是gradle版本与Flutter使用的Java版本不兼容,那么我们可以尝试更改当前Flutter使用的Java版本。
当前Flutter使用的Java版本如何查看呢?在你的Flutter项目的根目录使用如下命令:
1 |
|
对于上面的项目,输出结果:
再次提醒,flutter analyze --suggestions
命令只在某个Flutter项目的根目录下可用,如果你尝试在其他无关目录使用这个命令会得到以下输出:
显示找不到App名称
可以看到,根据这个命令的输出,我们发现,Flutter使用的Java版本是21.0.7
,同时我们还可以看到本项目当前使用的Gradle版本是7.6.3
,查阅Gradle官方的Java兼容性表:
我们发现,7.6
版本的Gradle兼容性应当在JDK19及以下,我们这里使用的JDK 21.0.7
自然就是不兼容了,我们可以使用如下命令来更换Flutter使用的JDK版本:
1 |
|
注意,--jdk-dir
参数的值是java home的位置,而非java
可执行文件的位置
配置完毕后,重启vscode或者关闭原先的vscode内置终端再打开一个新终端,更改即可生效,这时再次尝试运行,发现不会再报刚才的错了。
以后?
如果你只是急于解决问题,你就可以退出本文了,为了完整性,接下来将介绍一下上述配置的原理,以及从此问题出发,介绍一些管理多Flutter版本和多JDK版本的方法,这样后续再遇到类似的问题就不会不知所措了。
原理
Flutter在编译项目时,会尝试从以下这几个目录按顺序查找JDK:
- 当前Android Studio所使用的JDK版本
JAVA_HOME
环境变量- 系统环境变量
PATH
一旦找到一个Java版本,即使不兼容当前Gradle,也不会再继续查找。
大部分坑都是因为Android Studio引起的,因为Android Studio使用的Java版本一般都比较前卫,你看看最新的Android Studio使用的Gradle版本和最新的Flutter使用的Gradle版本的差距就知道了。
Flutter多版本管理
多版本Flutter的管理相信不会有疑问,选择fvm就对了,唯一的缺点就是执行Flutter命令的时候都得使用fvm flutter
,但是其带来的方便性完全可以抵消这一点不便,甚至你还可以在shell的rc文件中写一个别名,例如在.zshrc
中:
1 |
|
这样就不用多输入一个fvm了
使用fvm管理Flutter版本可能会遇到一些问题,例如一些CLI工具找不到dart
或flutter
命令等(即使你按照上面的的步骤设置了alias也会提示找不到命令),如果有遇到这类问题请参阅:使用fvm导致一些CLI工具无法找到flutter命令的解决方案
vscode中的Flutter版本管理
在vscode中,Flutter版本是通过vscode中的设置确定的,作为我们平时开发Flutter应用经常使用的IDE,还是要熟悉它的Flutter版本使用机制。
首先打开Vscode的设置,或者按快捷键command + ,
,在设置搜索框中搜索"flutter sdk",可以看到两个相关的设置项:
第一个设置项直接指定使用的Flutter SDK所在的目录,我们还可以从设置的说明中看出,vscode会从以下地方依次寻找Flutter SDK:
- 当前项目所在目录
- 环境变量FLUTTER_ROOT所指定的Flutter目录
- PATH环境变量
第二个设置则是给VSCode指明一个存放所有Flutter SDK的路径,设定了这个设置项后,我们就可以在Flutter项目中,使用快捷键command + shift + P
然后输入Flutter: Change SDK
命令来快速切换当前项目所使用的Flutter SDK版本了:
Java的多版本管理
jenv是一个Java的版本管理器,适用于Linux/macOS,这个工具本身不提供JDK的下载,只是用户手动添加JDK的路径,然后它将会帮你管理起来,支持项目级、全局、shell级的JDK版本设定
Windows用户可以使用jabba,这是一个跨平台的JDK多版本管理工具,Linux和macOS也可用。但个人使用下来,还是感觉jenv更加方便,而且每个添加给jenv进行管理的JDK路径信息都可以通过jenv命令查看,手动添加JDK进行管理的方式也让心里不用操心这个工具究竟把JDK安装在哪儿了。