Skip to content

Commit 4f0062a

Browse files
authored
Recommend JDK when missing (#115)
* Recommend JDK when missing * Remove unused import * Complete logic to search for JDK
1 parent 5ba92b6 commit 4f0062a

File tree

8 files changed

+208
-19
lines changed

8 files changed

+208
-19
lines changed

.vscode/extensions.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,5 @@
22
// See http://go.microsoft.com/fwlink/?LinkId=827846
33
// for the documentation about the extensions.json format
44
"recommendations": [
5-
"eg2.tslint"
65
]
76
}

package-lock.json

Lines changed: 90 additions & 18 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,16 +60,22 @@
6060
"test": "npm run compile && node ./node_modules/vscode/bin/test"
6161
},
6262
"devDependencies": {
63+
"@types/expand-tilde": "^2.0.0",
64+
"@types/find-java-home": "^0.2.0",
6365
"@types/jquery": "^3.3.24",
6466
"@types/node": "^8.10.40",
67+
"@types/path-exists": "^3.0.0",
6568
"@types/semver": "^5.5.0",
6669
"autoprefixer": "^8.5.1",
6770
"bootstrap": "^4.3.1",
6871
"css-loader": "^0.28.11",
72+
"expand-tilde": "^2.0.2",
73+
"find-java-home": "^0.2.0",
6974
"html-webpack-inline-source-plugin": "0.0.10",
7075
"html-webpack-plugin": "^3.2.0",
7176
"jquery": "^3.3.1",
7277
"node-sass": "^4.11.0",
78+
"path-exists": "^3.0.0",
7379
"popper.js": "^1.14.7",
7480
"postcss-loader": "^2.1.5",
7581
"sass-loader": "^7.0.1",

src/extension.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { initialize as initCommands } from "./commands";
99
import { initialize as initRecommendations } from "./recommendation";
1010
import { initialize as initMisc, showReleaseNotesOnStart } from "./misc";
1111
import { showOverviewPageOnActivation, OverviewViewSerializer } from './overview';
12+
import { validateJavaRuntime } from "./java-runtime";
1213

1314
export async function activate(context: vscode.ExtensionContext) {
1415
initializeTelemetry(context);
@@ -25,6 +26,10 @@ async function initializeExtension(operationId: string, context: vscode.Extensio
2526

2627
await showOverviewPageOnActivation(context);
2728
await showReleaseNotesOnStart(context);
29+
30+
if (!await validateJavaRuntime()) {
31+
vscode.commands.executeCommand("java.overview");
32+
}
2833
}
2934

3035
function initializeTelemetry(context: vscode.ExtensionContext) {

src/java-runtime/index.ts

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT license.
3+
4+
import * as vscode from "vscode";
5+
import * as cp from "child_process";
6+
import * as path from "path";
7+
import * as expandTilde from "expand-tilde";
8+
import * as pathExists from "path-exists";
9+
import findJavaHome = require("find-java-home");
10+
11+
const isWindows = process.platform.indexOf("win") === 0;
12+
const JAVAC_FILENAME = path.join("bin", "javac" + (isWindows ? ".exe" : "")) ;
13+
const JAVA_FILENAME = path.join("bin", "java" + (isWindows ? ".exe" : ""));
14+
15+
async function getJavaVersion(javaHome: string | undefined): Promise<number> {
16+
if (!javaHome) {
17+
return Promise.resolve(0);
18+
}
19+
20+
return new Promise<number>((resolve, reject) => {
21+
cp.execFile(path.resolve(javaHome, JAVA_FILENAME),["-version"], {}, (err, stdout, stderr) => {
22+
const regex = /version "(\d+)\.(\d+).*"/g;
23+
const match = regex.exec(stderr);
24+
if (!match) {
25+
resolve(0);
26+
return;
27+
}
28+
29+
let major = parseInt(match[1]), minor = parseInt(match[2]);
30+
if (major === 1) {
31+
resolve(minor);
32+
}
33+
34+
resolve(major);
35+
});
36+
});
37+
}
38+
39+
async function findPossibleJdkInstallations(): Promise<{[location : string] : string | undefined}> {
40+
return new Promise((resolve, reject) => {
41+
const javaHomeEntries: {[location : string] : string | undefined} = {
42+
"java.home": vscode.workspace.getConfiguration().get("java.home", undefined),
43+
"JDK_HOME": process.env["JDK_HOME"],
44+
"JAVA_HOME": process.env["JAVA_HOME"],
45+
"java.other": undefined
46+
};
47+
48+
findJavaHome({allowJre: false}, (err, home) => {
49+
if (!err) {
50+
javaHomeEntries.other = home;
51+
}
52+
53+
resolve(javaHomeEntries);
54+
});
55+
});
56+
}
57+
58+
async function validateJdkInstallation(javaHome: string | undefined) {
59+
if (!javaHome) {
60+
return false;
61+
}
62+
63+
javaHome = expandTilde(javaHome);
64+
return await pathExists(path.resolve(javaHome, JAVAC_FILENAME));
65+
}
66+
67+
export async function validateJavaRuntime() {
68+
const jdkEntries = await findPossibleJdkInstallations();
69+
for (const key in jdkEntries) {
70+
if (jdkEntries.hasOwnProperty(key)) {
71+
const entry = jdkEntries[key];
72+
if (await validateJdkInstallation(entry) && await getJavaVersion(entry) >= 8) {
73+
return true;
74+
}
75+
}
76+
}
77+
78+
return false;
79+
}

0 commit comments

Comments
 (0)