Android Studio使用的JDK位置与Gradle默认使用的位置不同。

34

Android Studio同步我的gradle项目后,我在事件日志中看到以下信息:

Android Studio正在使用此JDK位置: /path/to/my/project/specific/jdk 与Gradle默认使用的不同: /path/to/android/studio/embedded/jdk 使用不同的位置可能会导致在从命令行运行Gradle任务时,同时使用Android Studio会产生多个Gradle守护进程。 将Android Studio设置为使用与Gradle相同的JDK并同步项目。

我在项目结构->SDK位置 -> JDK位置 -> 其他中设置了/path/to/my/project/specific/jdk Project Structure -> SDK Location -> JDK Location -> Other

我在.bash_profile中有以下内容:

export JAVA_HOME=/path/to/my/project/specific/jdk

而且 STUDIO_JDK文档 表示:

设置要运行 Studio 的 JDK 的位置。当您启动 Android Studio 时,它按顺序检查 STUDIO_JDKJDK_HOMEJAVA_HOME 环境变量。

因此我期望 Android Studio 可以找到 /path/to/my/project/specific/jdk,但它没有找到。是否有专门针对 Gradle 的特殊 JDK 设置?

7个回答

21

更新

仅适用于 macOS,且发生在 macOS Mojave 10.14.6。在 macOS Catalina 10.15.3 上,你只需要在 shell 中设置 JAVA_HOME

本答案仅处理 macOS 情况,不涉及 Linux 或 Windows 解决方案。

简述

macOS 上,当从 Finder.app 启动 Android Studio 时,它不会接收到在 .bash_profile 中定义的环境变量。你必须launchctl 中定义你的环境变量

launchctl setenv JAVA_HOME /path/to/my/project/specific/jdk

或者,如果您想使用系统定义的JDK:

launchctl setenv JAVA_HOME `/usr/libexec/java_home`

但这仅适用于您机器的当前会话。接下来,您需要创建一个~/Library/LaunchAgents/environment.plist文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>my.startup</string>
  <key>ProgramArguments</key>
  <array>
    <string>sh</string>
    <string>-c</string>
    <string>
    launchctl setenv JAVA_HOME /path/to/my/project/specific/jdk
    </string>

  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

或者,如果您想使用系统定义的JDK:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>my.startup</string>
  <key>ProgramArguments</key>
  <array>
    <string>sh</string>
    <string>-c</string>
    <string>
    launchctl setenv JAVA_HOME `/usr/libexec/java_home`
    </string>

  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

系统重启后,plist文件将被激活。您也可以使用launchctl load ~/Library/LaunchAgents/environment.plist立即启动它。

更深入的解释

我怀疑Android Studio实际上没有看到我的JAVA_HOME环境变量,所以我检查了Android Studio进程的环境变量

$ ps ax | grep Android
13466   ??  S    177:42.60 /path/to/my/Android/sdk/emulator/qemu/darwin-x86_64/qemu-system-x86_64 -netdelay none -netspeed full -no-snapstorage -avd Pixel_2_API_28
13478   ??  S      0:04.88 /path/to/my/Android/sdk/emulator/emulator64-crash-service -pipe com.google.AndroidEmulator.CrashService.13466 -ppid 13466 -data-dir /tmp/foo/9ecb0c71-921f-44b8-8b77-f34ac80bb8fa
40253   ??  R      6:21.34 /Applications/Android Studio-3.5-Preview.app/Contents/MacOS/studio
40342   ??  S      0:00.07 /Applications/Android Studio-3.5-Preview.app/Contents/bin/fsnotifier
40610 s001  S+     0:00.00 grep Android

$ ps eww 40253
/Applications/Android Studio-3.5-Preview.app/Contents/MacOS/studio TMPDIR=/var/folders/j4/htlnmbf97vlcdszj7_x8g0vh4k3_fp/T/ __CF_USER_TEXT_ENCODING=0x921A9D6:0x0:0x0 SHELL=/bin/false HOME=/Users/myusername Apple_PubSub_Socket_Render=/private/tmp/com.apple.launchd.zL6tIxvlEo/Render SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.sKG8qr6MNW/Listeners PATH=/usr/bin:/bin:/usr/sbin:/sbin LOGNAME=myusername XPC_SERVICE_NAME=com.google.android.studio-EAP.21860 USER=myusername XPC_FLAGS=0x1

这意味着Android Studio没有识别到我的JAVA_HOME,正如我所怀疑的那样。

接下来,我尝试从终端启动Android Studio:

$ echo $JAVA_HOME
/path/to/my/project/specific/jdk
$ open /Applications/Android Studio-3.5-Preview.app
$ ps eww <Android Studio Pid>

这导致输出了更多的内容,包括我的JAVA_HOME。因此,我需要找出如何为从Finder.app启动的应用程序设置环境变量,我在上面进行了描述。

我认为这个答案的背景是在OSX操作系统中('Finder'是本地文件管理器)。这让我想知道Ubuntu操作系统是否也适用同样的原则? - gatorback
这只会发生在macOS Mojave 10.14.6上。在macOS Catalina 10.15.3上是错误的。 - Ojonugwa Jude Ochalifu
2
@OjonugwaJudeOchalifu,WRONG是什么意思?请更具体和建设性地说明。 - Heath Borders
@HeathBorders 哈哈。我的意思是我有同样的问题,但我不在 MacOS 上。 - Ojonugwa Jude Ochalifu
谢谢。我会编辑答案,提到它是在“macOS”环境下的。 - Heath Borders

13

我在更新到Android Studio 3.6版本后开始收到这个警告。 我收到以下警告:

    Android Studio and Gradle are using different locations for the JDK.
    Android Studio: C:\Program Files\Android\Android Studio\jre
    Gradle: C:\Program Files\AdoptOpenJDK\jdk-11.0.3.7-hotspot
    Using different JDK locations might cause Gradle to spawn multiple daemons
    when executing tasks for Android Studio and other external processes.
为了解决这个警告,我将项目JDK位置更改为Gradle JDK位置。
  1. 在项目窗口中右键单击app
  2. 打开模块设置
  3. SDK位置
  4. JDK位置
  5. 从下拉菜单中选择Gradle的JDK位置。 在我的情况下,它的位置如下:

    Gradle: C:\Program Files\AdoptOpenJDK\jdk-11.0.3.7-hotspot
    
    点击申请并确认。

太好了,这正是我所需要的。谢谢! - Forrest
我的Windows机器上安装了JDK 13,希望这不会影响Android Studio的使用。虽然警告已经消失了,看起来应该没问题。 - Xgh05t
我正在使用一种自定义 JVM(来自我们公司),它存储在另一个位置。我该怎么办? - aB9
非常感谢!我在将我的Android Studio更新到4.0版本后也遇到了同样的问题。 - jashgopani

7

enter image description here我也在使用来自Microsoft的Windows系统。为了解决这个问题,请按照以下简单步骤进行:

  1. JAVA_HOME环境变量设置为指向已安装的JDK。在我的情况下,路径是C:\Program Files\Java\jdk-9.0.1

  2. 然后,在Android Studio中,从“事件日志”中选择“从文件系统中选择JDK”,或者前往项目结构选择SDK位置。

  3. 将JDK位置设置为上图所示的位置,然后点击应用。


3

我正在使用Windows系统,在升级至AS 3.6.1时遇到了同样的错误。

除了Android项目外,我还在同一台机器上构建Java项目,两者使用不同版本的Java。因此,将AS/Gradle wrapper指向我的JAVA_HOME不是一个选项。

为了解决这个问题,我需要将环境变量JAVA_HOME指向我的Java项目,而将AS/Gradle的JAVA_HOME指向AS附带的JRE版本。

有一个简单的解决方案。虽然有点凌乱,但它确实有效。你需要能够看到隐藏文件。然后按以下方式修改Gradle wrapper批处理文件:

C:/Users/your_user_name/.gradle/wrapper/dists/the_latest_gradle_version(mine is 5.6.4)/bxirm19lnfz6nurbatndyydux/gradle-5.6.4/bin/gradle.bat

前往此函数:

:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe

并改为:

:findJavaFromJavaHome
set JAVA_HOME=%C:/Program Files/Android/AndroidStudio/jre:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe

这不是一个永久的解决方案,因为它可能会被新版本的Gradle覆盖,但它现在可以工作,并希望能够长时间使用,直到有人(希望是Google)默认将AS和Gradle包装程序指向正确的位置。


3
在MacOS Catalina 10.15.7上使用Android Studio 4.1,从finder启动Android Studio仍然无法识别JAVA_HOME(尽管更新了已接受答案的内容)。因此,Android Studio使用其嵌入的JDK,而gradle使用在JAVA_HOME中指定的JDK。
在我的情况下,我并不特别关心版本(它们足够接近),所以我只是将gradle设置为使用嵌入的JDK(这是Android Studio默认使用的)。如果您关心版本并且不希望使用嵌入的JDK,请遵循已接受的答案。否则,我所做的可能更快。
以下是选择在gradle中使用嵌入JDK的方法。至少现在Android Studio中的措辞更清晰,说明此设置仅适用于Gradle使用的JDK。 Setting the JDK used by gradle in Android Studio project settings

2

我正在使用Windows系统。我进入控制面板并打开了环境变量,复制了JAVA_HOME键的位置。我将此目录放入Android Studio中的Project Structure/SDK Location窗口中。保存更改后,Gradle能够无问题同步。SDK Locations窗口的位置在这篇文章中。


0
在我的情况下,这个问题出现在我创建一个新项目时。为了解决这个问题,我选择了下面显示的JDK。

enter image description here


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