Skip to content

Commit ed912fb

Browse files
Eskibearfbricon
authored andcommitted
improve java version checking
Signed-off-by: Yan Zhang <[email protected]>
1 parent 8348f61 commit ed912fb

File tree

2 files changed

+59
-17
lines changed

2 files changed

+59
-17
lines changed

src/requirements.ts

Lines changed: 53 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -80,34 +80,75 @@ function checkJavaRuntime(context: ExtensionContext): Promise<string> {
8080
});
8181
}
8282

83-
function checkJavaVersion(javaHome: string): Promise<number> {
83+
async function checkJavaVersion(javaHome: string): Promise<number> {
84+
let javaVersion = await checkVersionInReleaseFile(javaHome);
85+
if (!javaVersion) {
86+
javaVersion = await checkVersionByCLI(javaHome);
87+
}
88+
return new Promise<number>((resolve, reject) => {
89+
if (javaVersion < 11) {
90+
openJDKDownload(reject, 'Java 11 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)');
91+
}
92+
return resolve(javaVersion);
93+
});
94+
}
95+
96+
/**
97+
* Get version by checking file JAVA_HOME/release
98+
*/
99+
async function checkVersionInReleaseFile(javaHome: string): Promise<number> {
100+
if (!javaHome) {
101+
return 0;
102+
}
103+
const releaseFile = path.join(javaHome, "release");
104+
if (!await fse.pathExists(releaseFile)) {
105+
return 0;
106+
}
107+
108+
try {
109+
const content = await fse.readFile(releaseFile);
110+
const regexp = /^JAVA_VERSION="(.*)"/gm;
111+
const match = regexp.exec(content.toString());
112+
if (!match) {
113+
return 0;
114+
}
115+
const majorVersion = parseMajorVersion(match[1]);
116+
return majorVersion;
117+
} catch (error) {
118+
// ignore
119+
}
120+
return 0;
121+
}
122+
123+
/**
124+
* Get version by parsing `JAVA_HOME/bin/java -version`
125+
*/
126+
function checkVersionByCLI(javaHome: string): Promise<number> {
84127
return new Promise((resolve, reject) => {
85128
const javaBin = path.join(javaHome, "bin", JAVA_FILENAME);
86129
cp.execFile(javaBin, ['-version'], {}, (error, stdout, stderr) => {
87-
const javaVersion = parseMajorVersion(stderr);
88-
if (javaVersion < 11) {
89-
openJDKDownload(reject, 'Java 11 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)');
130+
const regexp = /version "(.*)"/g;
131+
const match = regexp.exec(stderr);
132+
if (!match) {
133+
return resolve(0);
90134
}
135+
const javaVersion = parseMajorVersion(match[1]);
91136
resolve(javaVersion);
92137
});
93138
});
94139
}
95140

96-
export function parseMajorVersion(content: string): number {
97-
let regexp = /version "(.*)"/g;
98-
let match = regexp.exec(content);
99-
if (!match) {
141+
export function parseMajorVersion(version: string): number {
142+
if (!version) {
100143
return 0;
101144
}
102-
let version = match[1];
103145
// Ignore '1.' prefix for legacy Java versions
104146
if (version.startsWith('1.')) {
105147
version = version.substring(2);
106148
}
107-
108149
// look into the interesting bits now
109-
regexp = /\d+/g;
110-
match = regexp.exec(version);
150+
const regexp = /\d+/g;
151+
const match = regexp.exec(version);
111152
let javaVersion = 0;
112153
if (match) {
113154
javaVersion = parseInt(match[0]);

test/standard-mode-suite/extension.test.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -121,18 +121,19 @@ suite('Java Language Extension - Standard', () => {
121121
test('should parse Java version', () => {
122122
// Test boundaries
123123
assert.equal(requirements.parseMajorVersion(null), 0);
124+
assert.equal(requirements.parseMajorVersion(undefined), 0);
124125
assert.equal(requirements.parseMajorVersion(''), 0);
125126
assert.equal(requirements.parseMajorVersion('foo'), 0);
126127
assert.equal(requirements.parseMajorVersion('version'), 0);
127128
assert.equal(requirements.parseMajorVersion('version ""'), 0);
128129
assert.equal(requirements.parseMajorVersion('version "NaN"'), 0);
129130

130131
// Test the real stuff
131-
assert.equal(requirements.parseMajorVersion('version "1.7"'), 7);
132-
assert.equal(requirements.parseMajorVersion('version "1.8.0_151"'), 8);
133-
assert.equal(requirements.parseMajorVersion('version "9"'), 9);
134-
assert.equal(requirements.parseMajorVersion('version "9.0.1"'), 9);
135-
assert.equal(requirements.parseMajorVersion('version "10-ea"'), 10);
132+
assert.equal(requirements.parseMajorVersion('1.7'), 7);
133+
assert.equal(requirements.parseMajorVersion('1.8.0_151'), 8);
134+
assert.equal(requirements.parseMajorVersion('9'), 9);
135+
assert.equal(requirements.parseMajorVersion('9.0.1'), 9);
136+
assert.equal(requirements.parseMajorVersion('10-ea'), 10);
136137
});
137138

138139
test('should detect debug flag', () => {

0 commit comments

Comments
 (0)