diff --git a/extension/src/constant.ts b/extension/src/constant.ts index 698751df4..9904c3394 100644 --- a/extension/src/constant.ts +++ b/extension/src/constant.ts @@ -23,6 +23,8 @@ export const NO_JAVA_EXECUTABLE = export const OPT_RESTART = "Restart"; +export const INSTALL_JDK = "Install JDK"; + export const GRADLE_SERVER_BASE_JVM_OPTS = "--add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.prefs/java.util.prefs=ALL-UNNAMED --add-opens=java.base/java.nio.charset=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED"; diff --git a/extension/src/server/GradleServer.ts b/extension/src/server/GradleServer.ts index 4dfe9dd1a..b5f2a4c54 100644 --- a/extension/src/server/GradleServer.ts +++ b/extension/src/server/GradleServer.ts @@ -7,8 +7,8 @@ import { commands } from "vscode"; import { sendInfo } from "vscode-extension-telemetry-wrapper"; import { getGradleServerCommand, getGradleServerEnv, quoteArg } from "./serverUtil"; import { Logger } from "../logger/index"; -import { NO_JAVA_EXECUTABLE, OPT_RESTART } from "../constant"; -import { redHatJavaInstalled } from "../util/config"; +import { NO_JAVA_EXECUTABLE, OPT_RESTART, INSTALL_JDK } from "../constant"; +import { extensionInstalled } from "../util/config"; import { BspProxy } from "../bs/BspProxy"; import { getRandomPipeName } from "../util/generateRandomPipeName"; const SERVER_LOGLEVEL_REGEX = /^\[([A-Z]+)\](.*)$/; @@ -51,7 +51,7 @@ export class GradleServer { } public async start(): Promise { let startBuildServer = false; - if (redHatJavaInstalled()) { + if (extensionInstalled("redhat.java")) { const isPrepared = this.bspProxy.prepareToStart(); if (isPrepared) { startBuildServer = true; @@ -65,12 +65,16 @@ export class GradleServer { const cwd = this.context.asAbsolutePath("lib"); const cmd = path.join(cwd, getGradleServerCommand()); const env = await getGradleServerEnv(); - const bundleDirectory = this.context.asAbsolutePath("server"); if (!env) { sendInfo("", { kind: "GradleServerEnvMissing", }); - await vscode.window.showErrorMessage(NO_JAVA_EXECUTABLE); + const choice = extensionInstalled("vscjava.vscode-java-pack") ? [INSTALL_JDK] : []; + vscode.window.showErrorMessage(NO_JAVA_EXECUTABLE, ...choice).then((selection) => { + if (selection === INSTALL_JDK) { + vscode.commands.executeCommand("java.installJdk"); + } + }); return; } const args = [ @@ -80,6 +84,7 @@ export class GradleServer { ]; if (startBuildServer) { const buildServerPipeName = this.bspProxy.getBuildServerPipeName(); + const bundleDirectory = this.context.asAbsolutePath("server"); args.push(quoteArg(`--pipeName=${buildServerPipeName}`)); args.push(quoteArg(`--bundleDir=${bundleDirectory}`)); } diff --git a/extension/src/util/config.ts b/extension/src/util/config.ts index 88c146e93..5ebf986d0 100644 --- a/extension/src/util/config.ts +++ b/extension/src/util/config.ts @@ -65,12 +65,12 @@ export async function findValidJavaHome(): Promise { return undefined; } -export function redHatJavaInstalled(): boolean { - return !!vscode.extensions.getExtension("redhat.java"); +export function extensionInstalled(extensionId: string): boolean { + return !!vscode.extensions.getExtension(extensionId); } export function getRedHatJavaEmbeddedJRE(): string | undefined { - if (!redHatJavaInstalled()) { + if (!extensionInstalled("redhat.java")) { return undefined; }