From 0564fef9d9aafc8f0843a25a57e5200cd0d40d11 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 20 Feb 2026 19:23:32 +0000 Subject: [PATCH 1/2] Initial plan From 07738c1280d38536c2a1a0753cea47f28bfb1efb Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 20 Feb 2026 19:28:31 +0000 Subject: [PATCH 2/2] Fix ArgumentException warning when JDK path is not a directory When JI_JAVA_HOME (or another JDK path source) points to a path that exists but is not a directory, TryGetJdkInfo now checks Directory.Exists before constructing JdkInfo. Non-directory paths are skipped silently (logged at Verbose only) instead of generating a Warning in MSBuild output. Fixes: ArgumentException "Not a directory" spurious warning Co-authored-by: rmarinho <1235097+rmarinho@users.noreply.github.com> --- .../JdkInfo.cs | 4 +++ .../JdkInfoTests.cs | 31 +++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/src/Xamarin.Android.Tools.AndroidSdk/JdkInfo.cs b/src/Xamarin.Android.Tools.AndroidSdk/JdkInfo.cs index 4969874b..d1bf3e65 100644 --- a/src/Xamarin.Android.Tools.AndroidSdk/JdkInfo.cs +++ b/src/Xamarin.Android.Tools.AndroidSdk/JdkInfo.cs @@ -358,6 +358,10 @@ public static IEnumerable GetSupportedJdkInfos (Action logger, string locator) { JdkInfo? jdk = null; + if (!Directory.Exists (path)) { + logger (TraceLevel.Verbose, $"Skipping JDK path `{path}` from `{locator}`: path does not exist or is not a directory."); + return jdk; + } try { jdk = new JdkInfo (path, locator); } diff --git a/tests/Xamarin.Android.Tools.AndroidSdk-Tests/JdkInfoTests.cs b/tests/Xamarin.Android.Tools.AndroidSdk-Tests/JdkInfoTests.cs index 3ec1a50e..c9519675 100644 --- a/tests/Xamarin.Android.Tools.AndroidSdk-Tests/JdkInfoTests.cs +++ b/tests/Xamarin.Android.Tools.AndroidSdk-Tests/JdkInfoTests.cs @@ -309,6 +309,37 @@ public void GetKnownSystemJdkInfos_DiscoversWindowsUserJdk (string folderName) } } + [Test] + public void GetKnownSystemJdkInfos_JiJavaHome_NonDirectoryPath_NoWarning () + { + // Reproduce https://github.com/dotnet/android-tools/issues/XXX: + // If JI_JAVA_HOME points to a path that exists but is not a directory, + // no Warning-level message should be logged. + var file = Path.GetTempFileName (); + var previous = Environment.GetEnvironmentVariable ("JI_JAVA_HOME", EnvironmentVariableTarget.Process); + try { + // file exists but is not a directory + Environment.SetEnvironmentVariable ("JI_JAVA_HOME", file, EnvironmentVariableTarget.Process); + + var warnings = new List (); + Action logger = (level, message) => { + if (level == TraceLevel.Warning) + warnings.Add (message); + }; + + JdkInfo.GetKnownSystemJdkInfos (logger).ToList (); + + // There should be no warning about the non-directory JI_JAVA_HOME path + Assert.IsFalse (warnings.Any (w => w.Contains (file)), + $"Unexpected warning logged for non-directory JI_JAVA_HOME path: {string.Join ("; ", warnings)}"); + } + finally { + Environment.SetEnvironmentVariable ("JI_JAVA_HOME", previous, EnvironmentVariableTarget.Process); + if (File.Exists (file)) + File.Delete (file); + } + } + [Test] [TestCase ("microsoft-21.jdk", false)] [TestCase ("jdk-21", true)]