Android Studio 正在使用这个 JDK 位置......这与 Gradle 默认使用的不同

Hea*_*ers 26 jvm gradle android-studio

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

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

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

我有以下内容.bash_profile

export JAVA_HOME=/path/to/my/project/specific/jdk
Run Code Online (Sandbox Code Playgroud)

并且STUDIO_JDK文档说:

设置用于运行 Studio 的 JDK 的位置。当你推出Android Studio中,它会检查STUDIO_JDKJDK_HOME以及JAVA_HOME 依次环境变量。

所以我希望 Android Studio 会找到/path/to/my/project/specific/jdk,但它不会。是否有专门针对 gradle 的特殊 JDK 设置?

Hea*_*ers 18

更新

因为macOS只发生在 macOS Mojave 上10.14.6。在 macOS Catalina 上10.15.3,您只需要JAVA_HOME在 shell 中进行设置。

这个答案涉及macOS案例。它并不意味着 Linux 或 Windows 解决方案。

TLDR

在 上macOS,Android Studio 在.bash_profileFinder.app. 您必须launchctl以下位置定义环境变量

launchctl setenv JAVA_HOME /path/to/my/project/specific/jdk
Run Code Online (Sandbox Code Playgroud)

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

launchctl setenv JAVA_HOME `/usr/libexec/java_home`
Run Code Online (Sandbox Code Playgroud)

但这仅适用于您机器的当前会话。接下来,您必须创建一个~/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>
Run Code Online (Sandbox Code Playgroud)

或者,如果您想使用系统定义的 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>
Run Code Online (Sandbox Code Playgroud)

The plist will activate after system reboot. You can also use launchctl load ~/Library/LaunchAgents/environment.plist to launch it immediately.

Deeper explanation

I suspected that Android Studio didn't actually see my JAVA_HOME environment variable, so I inspected the Android Studio process' environment variables:

$ 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
Run Code Online (Sandbox Code Playgroud)

which meant Android Studio didn't see my JAVA_HOME, as I suspected.

Next, I tried launching Android Studio from the terminal:

$ echo $JAVA_HOME
/path/to/my/project/specific/jdk
$ open /Applications/Android Studio-3.5-Preview.app
$ ps eww <Android Studio Pid>
Run Code Online (Sandbox Code Playgroud)

and this dumped a lot more output, including my JAVA_HOME. Thus, I needed to figure out how to set an environment variable for apps launched from Finder.app, which I describe above.

  • @OjonugwaJudeOchalifu “错误”是什么意思?请说得更具体、更有建设性。 (2认同)

小智 11

更新到 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.
Run Code Online (Sandbox Code Playgroud)

为了修复这个警告,我将项目 JDK 位置更改为 Gradle JDK 位置。

  1. 右键单击项目窗口中的应用程序
  2. 打开模块设置
  3. SDK位置
  4. JDK位置
  5. 从下拉列表中选择 Gradle 的 JDK 位置。就我而言,它位于以下位置:

    Gradle: C:\Program Files\AdoptOpenJDK\jdk-11.0.3.7-hotspot
    
    Run Code Online (Sandbox Code Playgroud)

单击应用和确定。


lie*_*dji 7

在此输入图像描述我也用的是微软的windows系统。要解决此问题,只需按照以下简单步骤操作即可。

  1. 设置JAVA_HOME环境变量以指向已安装的 jdk。就我而言,这是C:\Program Files\Java\jdk-9.0.1

  2. 然后,在 Android studio 中,单击从偶数日志中的文件系统中选择 JDK或转到项目结构,然后转到 sdk 位置。

  3. 按照上图所示设置jdk位置,然后单击“应用”。