static IEnumerable <string> GetJavaAlternativesJdkPaths() { var alternatives = Path.GetFullPath("/usr/sbin/update-java-alternatives"); if (!File.Exists(alternatives)) { return(Enumerable.Empty <string> ()); } var psi = new ProcessStartInfo { FileName = alternatives, Arguments = "-l", }; var paths = new List <string> (); ProcessUtils.Exec(psi, (o, e) => { if (string.IsNullOrWhiteSpace(e.Data)) { return; } // Example line: // java-1.8.0-openjdk-amd64 1081 /usr/lib/jvm/java-1.8.0-openjdk-amd64 var columns = e.Data.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); if (columns.Length <= 2) { return; } paths.Add(columns [2]); }); return(paths); }
static Dictionary <string, List <string> > GetJavaProperties(string java) { var javaProps = new ProcessStartInfo { FileName = java, Arguments = "-XshowSettings:properties -version", }; var props = new Dictionary <string, List <string> > (); string curKey = null; if (!AnySystemJavasInstalled() && (java == "/usr/bin/java" || java == "java")) { return(props); } ProcessUtils.Exec(javaProps, (o, e) => { const string ContinuedValuePrefix = " "; const string NewValuePrefix = " "; const string NameValueDelim = " = "; if (string.IsNullOrEmpty(e.Data)) { return; } if (e.Data.StartsWith(ContinuedValuePrefix, StringComparison.Ordinal)) { if (curKey == null) { throw new InvalidOperationException($"Unknown property key for value {e.Data}!"); } props [curKey].Add(e.Data.Substring(ContinuedValuePrefix.Length)); return; } if (e.Data.StartsWith(NewValuePrefix, StringComparison.Ordinal)) { var delim = e.Data.IndexOf(NameValueDelim, StringComparison.Ordinal); if (delim <= 0) { return; } curKey = e.Data.Substring(NewValuePrefix.Length, delim - NewValuePrefix.Length); var value = e.Data.Substring(delim + NameValueDelim.Length); List <string> values; if (!props.TryGetValue(curKey, out values)) { props.Add(curKey, values = new List <string> ()); } values.Add(value); } }); return(props); }
static IEnumerable <string> GetLibexecJdkPaths(Action <TraceLevel, string> logger) { var java_home = Path.GetFullPath("/usr/libexec/java_home"); if (!File.Exists(java_home)) { yield break; } var jhp = new ProcessStartInfo { FileName = java_home, Arguments = "-X", }; var xml = new StringBuilder(); ProcessUtils.Exec(jhp, (o, e) => { if (string.IsNullOrEmpty(e.Data)) { return; } xml.Append(e.Data); }, includeStderr: false); var plist = XElement.Parse(xml.ToString()); foreach (var info in plist.Elements("array").Elements("dict")) { var JVMHomePath = (XNode)info.Elements("key").FirstOrDefault(e => e.Value == "JVMHomePath"); if (JVMHomePath == null) { continue; } while (JVMHomePath.NextNode.NodeType != XmlNodeType.Element) { JVMHomePath = JVMHomePath.NextNode; } var strElement = (XElement)JVMHomePath.NextNode; var path = strElement.Value; yield return(path); } }