如何在Android Studio中通过Gradle获取JDK路径?

12
为了构建一些Android项目,需要设置环境变量 JAVA_HOME。(请参见这个Stack Exchange问题flutter bug report。)
这是我正在工作的一个项目的情况。我想改变Gradle文件,使得不需要设置JAVA_HOME是否有任何方法让Gradle获取封装在Android Studio进程中使用的JDK路径(或通过进程传递JDK而无需用户干预)? 这应该可以在未设置JAVA_HOME时工作。

刚刚将问题重新标记了更通用的标签,因为Gradle完全不需要Android Studio。 - Martin Zeitler
@MartinZeitler 即使这个问题是关于Android Studio与Gradle的交互? - Ellen Spertus
Gradle并不是从Android Studio获取路径,而是从它自己的配置或环境变量中获取(两种方式如下所示)。在使用Android Studio构建时,Gradle只是在CLI上调用,但与此无关;它是一个生成工作进程的守护程序。 - Martin Zeitler
2个回答

5

通常有两种可用选项:

a)编辑 gradle.properties 文件并定义您想要使用的JDK:

org.gradle.java.home=(path to JDK home)

由于这是一个“先有鸡还是先有蛋”的问题,因此无法动态设置路径。

而且它在其他计算机上可能也会失败,因为路径可能不同。

但可以将其作为命令行选项传递:

./gradlew -Dorg.gradle.java.home=$JAVA_PATH

参考链接:构建环境


b) 另外,可以在文件gradlew顶部添加export JDK_HOME语句。可以编写一个shell脚本来检测Linux上的默认JDK安装情况(Android Studio运行在JRE上):

tmp=`which java`
export JAVA_HOME=${tmp::-9}


echo $JAVA_HOME
/usr/java/jdk1.8.0_172

当然,还需要考虑完全没有JDK存在的情况:
/usr/bin/which: no java in ...

通常情况下,这假定默认的JDK已经通过alternatives设置好了,因为软件包管理器通常会这样做;例如 yum install jdk1.8.0_102.x86_64。问题在于,在Windows上没有一种简单的方式可以确定要使用哪个JDK路径,因为Windows没有which命令,而且可能需要从注册表中读取。一个辅助的PowerShell脚本或可执行文件可以查找该值并截断如有需要,从文件gradlew.bat调用。仍然可能有其他获取路径的方法。


"which java" 没有起作用,因为安装 JDK 时 Android Studio 没有更新路径或设置环境变量。无论如何,我们的目标是使其自动工作,而不需要用户做任何事情。我不知道这是否可能。 - Ellen Spertus
@EllenSpertus 这在 Linux 上动态设置变量,当将其添加到文件“gradlew”的顶部时...假定已安装 java。如上所述,“gradlew”是通过 CLI 调用的,因此 Windows 和 Linux 有所不同。 - Martin Zeitler
很抱歉,建议使用 tmp=which java export JAVA_HOME=${tmp::-9} 在Ubuntu20.04中不起作用,因为JAVA-HOME将仅为'/usr',如果我们使用标准java,则应指向'/usr/lib/jvm/java-11-openjdk-amd64/'。这是因为Ubuntu使用符号链接和替代设置,这些设置很难解析,无法确定最终目标。 - Reijo Korhonen

4

您可以在your_project_path/app/build.gradle中定义一个任务。

task javaHome {
    println "JAVA_HOME:" + System.getProperty("java.home")
}

执行任务:

./gradlew -q app:javaHome

结果:

JAVA_HOME:/usr/lib/jvm/java-8-openjdk-amd64/jre


谢谢,但这并没有回答我的问题,我的问题是如果用户没有设置环境变量,如何获取Android Studio使用的JDK路径。我修改了我的问题以使其更清晰。 - Ellen Spertus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接