dotnet/maui · error · Exception
JAVA_HOME environment variable isn't set. Set it to your JDK
Error message
JAVA_HOME environment variable isn't set. Set it to your JDK installation (e.g. "C:\Program Files (x86)\Android\openjdk\jdk-17.0.8.101-hotspot\bin").
What it means
Thrown at the top of android.cake when EnvironmentVariable("JAVA_HOME") is null. The Android toolchain (adb, emulator, gradle, the SDK build-tools) requires a JDK, located via JAVA_HOME, so the script aborts immediately before configuring any Android test variables.
Source
Thrown at eng/devices/android.cake:16
#addin nuget:?package=Cake.Android.Adb&version=3.2.0
#addin nuget:?package=Cake.Android.AvdManager&version=2.2.0
#load "./uitests-shared.cake"
const int DefaultApiLevel = 30;
const int EmulatorStartProcessTimeoutSeconds = 1 * 60;
const int EmulatorBootTimeoutSeconds = 10 * 60;
const int EmulatorKillTimeoutSeconds = 1 * 60;
const int AdbCommandTimeoutSeconds = 30;
Information("Local Dotnet: {0}", localDotnet);
if (EnvironmentVariable("JAVA_HOME") == null)
{
throw new Exception("JAVA_HOME environment variable isn't set. Set it to your JDK installation (e.g. \"C:\\Program Files (x86)\\Android\\openjdk\\jdk-17.0.8.101-hotspot\\bin\").");
}
string DEFAULT_ANDROID_PROJECT = "../../src/Controls/tests/TestCases.Android.Tests/Controls.TestCases.Android.Tests.csproj";
var projectPath = Argument("project", EnvironmentVariable("ANDROID_TEST_PROJECT") ?? DEFAULT_ANDROID_PROJECT);
var testDevice = Argument("device", EnvironmentVariable("ANDROID_TEST_DEVICE") ?? $"android-emulator-64_{DefaultApiLevel}");
var targetFramework = Argument("tfm", EnvironmentVariable("TARGET_FRAMEWORK") ?? $"{DotnetVersion}-android");
var binlogArg = Argument("binlog", EnvironmentVariable("ANDROID_TEST_BINLOG") ?? "");
var testApp = Argument("app", EnvironmentVariable("ANDROID_TEST_APP") ?? "");
var testAppProjectPath = Argument("appproject", EnvironmentVariable("ANDROID_TEST_APP_PROJECT") ?? DEFAULT_APP_PROJECT);
var testAppPackageName = Argument("package", EnvironmentVariable("ANDROID_TEST_APP_PACKAGE_NAME") ?? "");
var testAppInstrumentation = Argument("instrumentation", EnvironmentVariable("ANDROID_TEST_APP_INSTRUMENTATION") ?? "");
var testResultsPath = Argument("results", EnvironmentVariable("ANDROID_TEST_RESULTS") ?? GetTestResultsDirectory()?.FullPath);
var deviceCleanupEnabled = Argument("cleanup", true);
var useCoreClr = Argument("coreclr", false);
// Device details
var deviceSkin = Argument("skin", EnvironmentVariable("ANDROID_TEST_SKIN") ?? "Nexus 5X");
var androidAvd = "";View on GitHub (pinned to f377ff1c5e)
Solutions
- Set JAVA_HOME to a JDK 17+ installation root (e.g. the OpenJDK bundled with Android Studio) and ensure %JAVA_HOME%/bin is on PATH.
- Export it in your shell profile and CI environment variables so it persists across sessions.
- Verify with `java -version` and `echo $JAVA_HOME` in the same shell that runs cake.
- On Windows, set it as a System environment variable, not just a User session variable, for service-based CI.
Example fix
# before # (JAVA_HOME unset) # after export JAVA_HOME="/usr/lib/jvm/java-17-openjdk" export PATH="$JAVA_HOME/bin:$PATH"
Defensive patterns
Strategy: validation
Validate before calling
if (string.IsNullOrEmpty(EnvironmentVariable("JAVA_HOME"))) {
var candidate = IsRunningOnWindows() ? @"C:\Program Files\Android\Android Studio\jbr" : "/usr/lib/jvm/java-17-openjdk";
if (DirectoryExists(candidate)) Environment.SetEnvironmentVariable("JAVA_HOME", candidate);
else throw new Exception("JAVA_HOME not set and no JDK found.");
} Prevention
- Set JAVA_HOME in shell profiles and CI env for all platforms.
- Pin a supported JDK version (17+) documented by the MAUI repo.
- Verify `java -version` in the same shell that runs cake.
When it happens
Trigger: The JAVA_HOME environment variable is not set in the process environment at the time android.cake loads.
Common situations: A CI agent without a JDK env var; a local shell that didn't source the profile exporting JAVA_HOME; JAVA_HOME set in a different case or name; the JDK was installed by Android Studio but the env var wasn't configured separately.
Related errors
- Environment variable 'ANDROID_SDK_ROOT' or 'ANDROID_HOME' mu
- PowerShell Core (pwsh) is not installed. Please install it t
- PowerShell Core (pwsh) is required on non-Windows platforms.
- Unable to find Visual Studio!
- Failed to download the package.
AI-assisted analysis of dotnet/maui@f377ff1c5e (2026-08-13).
Data as JSON: /api/errors/3086c779de3ca034.
Report an issue: GitHub.