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

  1. 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.
  2. Export it in your shell profile and CI environment variables so it persists across sessions.
  3. Verify with `java -version` and `echo $JAVA_HOME` in the same shell that runs cake.
  4. 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

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


AI-assisted analysis of dotnet/maui@f377ff1c5e (2026-08-13). Data as JSON: /api/errors/3086c779de3ca034. Report an issue: GitHub.