in src/java-runtime/utils/upstreamApi.ts [15:108]
export async function resolveRequirements(): Promise<{
tooling_jre: string | undefined; // Used to launch Java extension.
tooling_jre_version: number;
java_home: string | undefined; // Used as default project JDK.
java_version: number;
}> {
const javaExtPath: string | undefined = vscode.extensions.getExtension("redhat.java")?.extensionPath
let toolingJre: string | undefined = await findEmbeddedJRE(javaExtPath);
let toolingJreVersion: number = await getMajorVersion(toolingJre);
return new Promise(async (resolve, reject) => {
let source: string;
const javaPreferences = checkJavaPreferences();
let preferenceName = javaPreferences.preference;
let javaVersion: number = 0;
let javaHome = javaPreferences.javaHome;
if (javaHome) { // java.jdt.ls.java.home or java.home setting has highest priority.
source = `java.home variable defined in ${env.appName} settings`;
javaHome = expandHomeDir(javaHome);
if (!await fse.pathExists(javaHome!)) {
invalidJavaHome(reject, `The ${source} points to a missing or inaccessible folder (${javaHome})`);
} else if (!await fse.pathExists(path.resolve(javaHome!, 'bin', JAVAC_FILENAME))) {
let msg: string;
if (await fse.pathExists(path.resolve(javaHome!, JAVAC_FILENAME))) {
msg = `'bin' should be removed from the ${source} (${javaHome})`;
} else {
msg = `The ${source} (${javaHome}) does not point to a JDK.`;
}
invalidJavaHome(reject, msg);
}
javaVersion = await getMajorVersion(javaHome);
if (preferenceName === "java.jdt.ls.java.home" || !toolingJre) {
toolingJre = javaHome;
toolingJreVersion = javaVersion;
}
}
// java.home not specified, search valid JDKs from env.JAVA_HOME, env.PATH, SDKMAN, jEnv, jabba, Common directories
const javaRuntimes = await findRuntimes({checkJavac: true, withVersion: true, withTags: true});
if (!toolingJre) { // universal version
// as latest version as possible.
sortJdksByVersion(javaRuntimes);
const validJdks = javaRuntimes.filter(r => r.version && r.version.major >= REQUIRED_JDK_VERSION);
if (validJdks.length > 0) {
sortJdksBySource(validJdks);
javaHome = validJdks[0].homedir;
javaVersion = validJdks[0].version?.major ?? 0;
toolingJre = javaHome;
toolingJreVersion = javaVersion;
}
} else { // pick a default project JDK/JRE
/**
* For legacy users, we implicitly following the order below to
* set a default project JDK during initialization:
* java.home > env.JDK_HOME > env.JAVA_HOME > env.PATH
*
* We'll keep it for compatibility.
*/
if (javaHome && (await getRuntime(javaHome) !== undefined)) {
const runtime = await getRuntime(javaHome, {withVersion: true});
if (runtime) {
javaHome = runtime.homedir;
javaVersion = runtime.version?.major ?? 0;
}
} else if (javaRuntimes.length) {
sortJdksBySource(javaRuntimes);
javaHome = javaRuntimes[0].homedir;
javaVersion = javaRuntimes[0].version?.major ?? 0;
} else if (javaHome = (await findDefaultRuntimeFromSettings() ?? "")) {
javaVersion = await getMajorVersion(javaHome);
} else {
/**
* Originally it was:
* invalidJavaHome(reject, "Please download and install a JDK to compile your project. You can configure your projects with different JDKs by the setting ['java.configuration.runtimes'](https://github.com/redhat-developer/vscode-java/wiki/JDK-Requirements#java.configuration.runtimes)");
*
* here we focus on tooling jre, so we swallow the error.
*
*/
}
}
if (!toolingJre || toolingJreVersion < REQUIRED_JDK_VERSION) {
// For universal version, we still require users to install a qualified JDK to run Java extension.
invalidJavaHome(reject, `Java ${REQUIRED_JDK_VERSION} or more recent is required to run the Java extension. Please download and install a recent JDK. You can still compile your projects with older JDKs by configuring ['java.configuration.runtimes'](https://github.com/redhat-developer/vscode-java/wiki/JDK-Requirements#java.configuration.runtimes)`);
}
resolve({
tooling_jre: toolingJre, // Used to launch Java extension.
tooling_jre_version: toolingJreVersion,
java_home: javaHome, // Used as default project JDK.
java_version: javaVersion,
});
});
}