diff --git a/src/Xamarin.Android.Tools.AndroidSdk/JdkInfo.cs b/src/Xamarin.Android.Tools.AndroidSdk/JdkInfo.cs index e82886d..6c4c8b8 100644 --- a/src/Xamarin.Android.Tools.AndroidSdk/JdkInfo.cs +++ b/src/Xamarin.Android.Tools.AndroidSdk/JdkInfo.cs @@ -281,10 +281,11 @@ public static IEnumerable GetKnownSystemJdkInfos (Action GetWindowsJdks (Action logger) return AndroidSdkWindows.GetJdkInfos (logger); } - static IEnumerable GetJavaHomeEnvironmentJdks (Action logger) + static IEnumerable GetEnvironmentVariableJdks (string envVar, Action logger) { - var java_home = Environment.GetEnvironmentVariable ("JAVA_HOME"); + var java_home = Environment.GetEnvironmentVariable (envVar); if (string.IsNullOrEmpty (java_home)) yield break; - var jdk = TryGetJdkInfo (java_home, logger, "$JAVA_HOME"); + var jdk = TryGetJdkInfo (java_home, logger, $"${envVar}"); if (jdk != null) yield return jdk; } diff --git a/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkWindows.cs b/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkWindows.cs index c363703..8740798 100644 --- a/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkWindows.cs +++ b/src/Xamarin.Android.Tools.AndroidSdk/Sdks/AndroidSdkWindows.cs @@ -108,7 +108,7 @@ protected override IEnumerable GetAllAvailableAndroidSdks () protected override string? GetJavaSdkPath () { - var jdk = GetJdkInfos (Logger).FirstOrDefault (); + var jdk = JdkInfo.GetKnownSystemJdkInfos (Logger).FirstOrDefault (); return jdk?.HomePath; } @@ -139,18 +139,7 @@ IEnumerable ToJdkInfos (IEnumerable paths, string locator) .Concat (ToJdkInfos (GetOpenJdkPaths (), "OpenJDK")) .Concat (ToJdkInfos (GetKnownOpenJdkPaths (), "Well-known OpenJDK paths")) .Concat (ToJdkInfos (GetOracleJdkPaths (), "Oracle JDK")) - .Concat (ToJdkInfos (GetEnvironmentJdkPaths (), "Environment Variables")); - } - - private static IEnumerable GetEnvironmentJdkPaths () - { - var environment = new [] { "JAVA_HOME" }; - foreach (var key in environment) { - var value = Environment.GetEnvironmentVariable (key); - if (!string.IsNullOrEmpty (value)) { - yield return value; - } - } + ; } private static IEnumerable GetPreferredJdkPaths () diff --git a/tests/Xamarin.Android.Tools.AndroidSdk-Tests/AndroidSdkInfoTests.cs b/tests/Xamarin.Android.Tools.AndroidSdk-Tests/AndroidSdkInfoTests.cs index 262a292..a02ffd6 100644 --- a/tests/Xamarin.Android.Tools.AndroidSdk-Tests/AndroidSdkInfoTests.cs +++ b/tests/Xamarin.Android.Tools.AndroidSdk-Tests/AndroidSdkInfoTests.cs @@ -136,9 +136,13 @@ public void Constructor_SetValuesFromPath () } [Test] - [Ignore ("This test will only work locally if you rename/remove your Open JDK directory.")] - public void JdkDirectory_JavaHome () + public void JdkDirectory_JavaHome ([Values ("JI_JAVA_HOME", "JAVA_HOME")] string envVar) { + if (envVar.Equals ("JAVA_HOME", StringComparison.OrdinalIgnoreCase)) { + Assert.Ignore ("This test will only work locally if you rename/remove your Open JDK directory."); + return; + } + CreateSdks (out string root, out string jdk, out string ndk, out string sdk); JdkInfoTests.CreateFauxJdk (jdk, releaseVersion: "1.8.999", releaseBuildNumber: "9", javaVersion: "1.8.999-9"); @@ -150,16 +154,15 @@ public void JdkDirectory_JavaHome () string java_home = null; try { // We only set via JAVA_HOME - java_home = Environment.GetEnvironmentVariable ("JAVA_HOME", EnvironmentVariableTarget.Process); - Environment.SetEnvironmentVariable ("JAVA_HOME", jdk); + java_home = Environment.GetEnvironmentVariable (envVar, EnvironmentVariableTarget.Process); + Environment.SetEnvironmentVariable (envVar, jdk, EnvironmentVariableTarget.Process); var info = new AndroidSdkInfo (logger, androidSdkPath: sdk, androidNdkPath: ndk, javaSdkPath: ""); Assert.AreEqual (ndk, info.AndroidNdkPath, "AndroidNdkPath not preserved!"); Assert.AreEqual (sdk, info.AndroidSdkPath, "AndroidSdkPath not preserved!"); Assert.AreEqual (jdk, info.JavaSdkPath, "JavaSdkPath not preserved!"); } finally { - if (java_home != null) - Environment.SetEnvironmentVariable ("JAVA_HOME", java_home, EnvironmentVariableTarget.Process); + Environment.SetEnvironmentVariable (envVar, java_home, EnvironmentVariableTarget.Process); Directory.Delete (root, recursive: true); } } diff --git a/tests/Xamarin.Android.Tools.AndroidSdk-Tests/JdkInfoTests.cs b/tests/Xamarin.Android.Tools.AndroidSdk-Tests/JdkInfoTests.cs index 122deed..594c6d0 100644 --- a/tests/Xamarin.Android.Tools.AndroidSdk-Tests/JdkInfoTests.cs +++ b/tests/Xamarin.Android.Tools.AndroidSdk-Tests/JdkInfoTests.cs @@ -11,6 +11,23 @@ namespace Xamarin.Android.Tools.Tests [TestFixture] public class JdkInfoTests { + [Test] + public void GetKnownSystemJdkInfos_PrefersJiJavaHome () + { + var previous = Environment.GetEnvironmentVariable ("JI_JAVA_HOME", EnvironmentVariableTarget.Process); + try { + Environment.SetEnvironmentVariable ("JI_JAVA_HOME", FauxJdkDir, EnvironmentVariableTarget.Process); + + var defaultJdkDir = JdkInfo.GetKnownSystemJdkInfos () + .FirstOrDefault (); + Assert.IsNotNull (defaultJdkDir); + Assert.AreEqual (FauxJdkDir, defaultJdkDir.HomePath); + } + finally { + Environment.SetEnvironmentVariable ("JI_JAVA_HOME", previous, EnvironmentVariableTarget.Process); + } + } + [Test] public void Constructor_NullPath () {