in Runtime/Core/InstalledJavaVersionCheck/InstalledJavaVersionProvider.cs [30:77]
public CheckInstalledJavaVersionResponse CheckInstalledJavaVersion(CheckInstalledJavaVersionRequest request)
{
var processStartInfo = new ProcessStartInfo();
processStartInfo.FileName = "java";
processStartInfo.Arguments = " -version";
processStartInfo.RedirectStandardError = true;
processStartInfo.UseShellExecute = false;
processStartInfo.CreateNoWindow = true;
string processOutput = null;
try
{
processOutput = _process.GetProcessOutput(processStartInfo);
}
catch (Exception ex)
{
Logger.LogError(ex, ex.Message);
return CreateCheckInstalledJavaVersionResponse(false);
}
if (processOutput == null) {
return CreateCheckInstalledJavaVersionResponse(false);
}
// Expected output format:
// (java|openjdk) version "<majorVersion>.<minorVersion>.<build>"
// ex: java version "1.8.0_291"
// openjdk version "1.8.0_322"
// openjdk version "19"
// majorVersion and minorVersion are integers. build can be anything
var outputPattern = new Regex("(?:openjdk|java) version \"(?<majorVersion>\\d+)(?:\\.(?<minorVersion>\\d+)(?:\\.[^\"]+))?\"");
Match outputMatch = outputPattern.Match(processOutput);
if (!outputMatch.Success) {
return CreateCheckInstalledJavaVersionResponse(false);
}
// if majorVersion is 1, we use minorVersion as the majorVersion, since java version had the format 1.?? until java 8
var majorVersion = outputMatch.Groups["majorVersion"].ToString();
var minorVersion = outputMatch.Groups["minorVersion"].ToString();
var actualMajorVersion = majorVersion.Equals("1") && !String.IsNullOrEmpty(minorVersion) ? minorVersion : majorVersion;
int.TryParse(actualMajorVersion, out int majorVersionAsNumber);
bool isInstalled = majorVersionAsNumber >= request.ExpectedMinimumJavaMajorVersion;
return CreateCheckInstalledJavaVersionResponse(isInstalled);
}