2023-12-09 19:25:29 +04:00
|
|
|
//go:build windows
|
|
|
|
// +build windows
|
|
|
|
|
2023-10-30 02:18:41 +04:00
|
|
|
package util
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"strconv"
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
"golang.org/x/sys/windows/registry"
|
|
|
|
)
|
|
|
|
|
|
|
|
const legacyJavaRegPath = "SOFTWARE\\JavaSoft\\Java Runtime Environment"
|
|
|
|
const jdkRegPath = "SOFTWARE\\JavaSoft\\JDK"
|
|
|
|
|
|
|
|
func LocateJavaHome(component string, majorVersion int) (string, error) {
|
|
|
|
if component == "jre-legacy" {
|
|
|
|
jre, err := registry.OpenKey(registry.LOCAL_MACHINE, legacyJavaRegPath, registry.QUERY_VALUE)
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
curVer, _, err := jre.GetStringValue("CurrentVersion")
|
|
|
|
if err != nil {
|
|
|
|
return "", nil
|
|
|
|
}
|
|
|
|
mVer, err := strconv.ParseInt(strings.Split(curVer, ".")[1], 10, 64)
|
|
|
|
if err != nil {
|
|
|
|
return "", nil
|
|
|
|
}
|
|
|
|
if mVer < int64(majorVersion) {
|
|
|
|
return "", fmt.Errorf("installed JRE version %s is older than allowed 1.%d", curVer, majorVersion)
|
|
|
|
}
|
|
|
|
jre, err = registry.OpenKey(registry.LOCAL_MACHINE, fmt.Sprintf("%s\\%s", legacyJavaRegPath, curVer), registry.QUERY_VALUE)
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
javaHome, _, err := jre.GetStringValue("JavaHome")
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
return javaHome, nil
|
|
|
|
} else {
|
|
|
|
jdk, err := registry.OpenKey(registry.LOCAL_MACHINE, jdkRegPath, registry.QUERY_VALUE)
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
curVer, _, err := jdk.GetStringValue("CurrentVersion")
|
|
|
|
if err != nil {
|
|
|
|
return "", nil
|
|
|
|
}
|
|
|
|
mVer, err := strconv.ParseInt(strings.Split(curVer, ".")[0], 10, 64)
|
|
|
|
if err != nil {
|
|
|
|
return "", nil
|
|
|
|
}
|
|
|
|
if mVer < int64(majorVersion) {
|
|
|
|
return "", fmt.Errorf("installed JDK version %d is older than allowed %d", mVer, majorVersion)
|
|
|
|
}
|
|
|
|
jdk, err = registry.OpenKey(registry.LOCAL_MACHINE, fmt.Sprintf("%s\\%s", jdkRegPath, curVer), registry.QUERY_VALUE)
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
javaHome, _, err := jdk.GetStringValue("JavaHome")
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
return javaHome, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
return "", nil
|
|
|
|
}
|