Ubuntu下Gradle构建Android项目:JAVA_HOME正确却提示JDK工具缺失
从你提供的命令输出来看,问题的核心很明确:虽然你的JAVA_HOME指向了JDK目录,但系统中实际生效的java命令来自JRE路径,Gradle在构建时优先使用了这个JRE环境,导致报错。下面一步步帮你解决:
1. 确认完整JDK是否已安装
首先检查是否安装了OpenJDK 8的完整JDK包(而不仅仅是JRE):
dpkg --list | grep openjdk-8-jdk
如果没有输出,说明你只装了JRE,需要安装完整JDK:
sudo apt-get install openjdk-8-jdk
2. 修正Java Alternatives配置
你的update-java-alternatives --list显示只有一个JDK条目,但readlink -f $(which java)指向了JRE的二进制文件,说明系统的java替代项配置有问题。执行以下命令将默认java切换到JDK的版本:
sudo update-alternatives --config java
如果有多个选项,选择对应/usr/lib/jvm/java-1.8.0-openjdk-amd64/bin/java的那一项(不是带jre的路径)。如果只有一个选项,先重新配置alternatives:
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-1.8.0-openjdk-amd64/bin/java 1081 sudo update-alternatives --set java /usr/lib/jvm/java-1.8.0-openjdk-amd64/bin/java
执行完后再验证:
readlink -f $(which java)
应该输出/usr/lib/jvm/java-1.8.0-openjdk-amd64/bin/java,而不是带jre的路径。
3. 确保Gradle正确使用JDK
即使系统配置修复了,有时候Gradle wrapper可能会缓存旧的环境信息,或者在项目中有自定义配置。你可以:
- 清理Gradle缓存并重新构建:
./gradlew clean build --no-build-cache - 直接在项目的
gradle.properties中指定JDK路径(彻底避免系统环境的影响):org.gradle.java.home=/usr/lib/jvm/java-1.8.0-openjdk-amd64
这样Gradle构建时会强制使用这个JDK路径,不会再调用JRE。
关于JAVA_HOME的实际配置位置
你提到在常见的用户配置文件中没找到JAVA_HOME的配置,这是因为Ubuntu中如果没有手动设置,JAVA_HOME通常是通过update-java-alternatives自动生成的,或者由某些系统脚本(比如你找到的/etc/ca-certificates/update.d/jks-keystore)临时导出的。如果需要永久设置JAVA_HOME,可以在/etc/profile.d下创建一个自定义脚本:
sudo nano /etc/profile.d/jdk.sh
写入内容:
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64 export PATH=$JAVA_HOME/bin:$PATH
保存后重启终端,JAVA_HOME就会永久生效。
至于Android Studio中构建正常的原因:Android Studio默认会自带或指定专属的JDK路径,不依赖系统全局的Java环境,所以不受这个问题影响。
内容的提问来源于stack exchange,提问作者c5525423

