diff --git a/package-lock.json b/package-lock.json index 7d29a105..f0a204cc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1838,15 +1838,6 @@ } } }, - "find-java-home": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/find-java-home/-/find-java-home-1.2.2.tgz", - "integrity": "sha512-rN2LcQa+YDwfnPT0TQgn015eYqJkn3h3G/uVX5oOD2Ge7gKOuoJrntAJO4BiGb+K6lo6Mb+xJdoqbfzqaC75gw==", - "requires": { - "which": "~1.0.5", - "winreg": "~1.2.2" - } - }, "find-up": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", @@ -2640,6 +2631,11 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, + "jdk-utils": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/jdk-utils/-/jdk-utils-0.4.3.tgz", + "integrity": "sha512-6d4tEkaBfpbQy32TF8lt+CFYaaWicBQEekWO5HozSzSMY4Y2ufsdNhpUbza0r2cuGEzoScE1r8vd9wkuUgypAA==" + }, "jest-worker": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", diff --git a/package.json b/package.json index bb480b10..79d68e85 100644 --- a/package.json +++ b/package.json @@ -90,9 +90,9 @@ "dependencies": { "@redhat-developer/vscode-redhat-telemetry": "0.4.2", "expand-home-dir": "^0.0.3", - "find-java-home": "1.2.2", "fs-extra": "^8.1.0", "glob": "^7.1.4", + "jdk-utils": "^0.4.3", "path-exists": "^4.0.0", "vscode-languageclient": "^7.0.0", "yauzl": "^2.10.0" diff --git a/src/server/requirements.ts b/src/server/requirements.ts index d400361e..2877b03c 100644 --- a/src/server/requirements.ts +++ b/src/server/requirements.ts @@ -4,10 +4,10 @@ import * as cp from 'child_process'; import * as path from 'path'; import { ConfigurationTarget, env, ExtensionContext, Uri, window, workspace } from 'vscode'; import { getJavaagentFlag, getJavaConfiguration, getKey, getXMLConfiguration, IS_WORKSPACE_JDK_ALLOWED, IS_WORKSPACE_JDK_XML_ALLOWED, IS_WORKSPACE_VMARGS_XML_ALLOWED, xmlServerVmargs } from '../settings/settings'; +import { findRuntimes, IJavaRuntime, getSources } from 'jdk-utils'; const pathExists = require('path-exists'); const expandHomeDir = require('expand-home-dir'); -const findJavaHome = require('find-java-home'); const isWindows = process.platform.indexOf('win') === 0; const JAVA_FILENAME = 'java' + (isWindows ? '.exe' : ''); @@ -45,14 +45,6 @@ function checkJavaRuntime(context: ExtensionContext): Promise { javaHome = await readJavaHomeConfig(context); if (javaHome) { source = 'The java.home variable defined in VS Code settings'; - } else { - javaHome = process.env['JDK_HOME']; - if (javaHome) { - source = 'The JDK_HOME environment variable'; - } else { - javaHome = process.env['JAVA_HOME']; - source = 'The JAVA_HOME environment variable'; - } } } @@ -66,14 +58,14 @@ function checkJavaRuntime(context: ExtensionContext): Promise { return resolve(javaHome); } //No settings, let's try to detect as last resort. - findJavaHome({ allowJre: true }, function (err, home) { - if (err) { - openJDKDownload(reject, 'Java runtime could not be located.'); - } - else { - resolve(home); - } - }); + const javaRuntimes = await findRuntimes({ withVersion: true, withTags: true }); + if (javaRuntimes.length) { + sortJdksBySource(javaRuntimes); + javaHome = javaRuntimes[0].homedir; + } else { + openJDKDownload(reject, "Java runtime could not be located. Please download and install Java or use the binary server."); + } + return resolve(javaHome); }); } @@ -127,6 +119,20 @@ export async function readXMLJavaHomeConfig(context: ExtensionContext) { } } +function sortJdksBySource(jdks: IJavaRuntime[]) { + const rankedJdks = jdks as Array; + const sources = ["JDK_HOME", "JAVA_HOME", "PATH"]; + for (const [index, source] of sources.entries()) { + for (const jdk of rankedJdks) { + if (jdk.rank === undefined && getSources(jdk).includes(source)) { + jdk.rank = index; + } + } + } + rankedJdks.filter(jdk => jdk.rank === undefined).forEach(jdk => jdk.rank = sources.length); + rankedJdks.sort((a, b) => a.rank - b.rank); +} + async function readJavaHomeConfig(context: ExtensionContext) { let javaHome = workspace.getConfiguration().inspect('java.home').workspaceValue; let isVerified = javaHome === undefined || javaHome === null;