in src/main/java/org/apache/maven/plugins/toolchain/jdk/ToolchainDiscoverer.java [405:474]
private Set<Path> doFindJdks() {
List<Path> dirsToTest = new ArrayList<>();
// add current JDK
dirsToTest.add(Paths.get(System.getProperty(JAVA_HOME)));
// check environment variables for JAVA{xx}_HOME
System.getenv().entrySet().stream()
.filter(e -> e.getKey().startsWith("JAVA") && e.getKey().endsWith("_HOME"))
.map(e -> Paths.get(e.getValue()))
.forEach(dirsToTest::add);
final Path userHome = Paths.get(System.getProperty(USER_HOME));
List<Path> installedDirs = new ArrayList<>();
// JDK installed by third-party tool managers
installedDirs.add(userHome.resolve(".jdks"));
installedDirs.add(userHome.resolve(".m2").resolve("jdks"));
installedDirs.add(userHome.resolve(".sdkman").resolve("candidates").resolve("java"));
installedDirs.add(userHome.resolve(".gradle").resolve("jdks"));
installedDirs.add(userHome.resolve(".jenv").resolve("versions"));
installedDirs.add(userHome.resolve(".jbang").resolve("cache").resolve("jdks"));
installedDirs.add(userHome.resolve(".asdf").resolve("installs"));
installedDirs.add(userHome.resolve(".jabba").resolve("jdk"));
// OS related directories
String osname = System.getProperty("os.name").toLowerCase(Locale.ROOT);
boolean macos = osname.startsWith("mac");
boolean win = osname.startsWith("win");
if (macos) {
installedDirs.add(Paths.get("/Library/Java/JavaVirtualMachines"));
installedDirs.add(userHome.resolve("Library/Java/JavaVirtualMachines"));
} else if (win) {
installedDirs.add(Paths.get("C:\\Program Files\\Java\\"));
Path scoop = userHome.resolve("scoop").resolve("apps");
if (Files.isDirectory(scoop)) {
try (Stream<Path> stream = Files.list(scoop)) {
stream.forEach(installedDirs::add);
} catch (IOException e) {
// ignore
}
}
} else {
installedDirs.add(Paths.get("/usr/jdk"));
installedDirs.add(Paths.get("/usr/java"));
installedDirs.add(Paths.get("/opt/java"));
installedDirs.add(Paths.get("/usr/lib/jvm"));
}
for (Path dest : installedDirs) {
if (Files.isDirectory(dest)) {
try (Stream<Path> stream = Files.list(dest)) {
stream.forEach(dir -> {
dirsToTest.add(dir);
if (macos) {
dirsToTest.add(dir.resolve("Contents").resolve("Home"));
}
});
} catch (IOException e) {
// ignore
}
}
}
// only keep directories that have a javac file
return dirsToTest.stream()
.filter(ToolchainDiscoverer::hasJavaC)
.map(ToolchainDiscoverer::getCanonicalPath)
.collect(Collectors.toSet());
}