Skip to content

Commit

Permalink
fix(requirements check): use regex to get java version from javac out…
Browse files Browse the repository at this point in the history
…put (apache#1220)

* fix(requirements check): use regex to get java version from javac output

* fix(lint): format code

* fix(node 10): remove optional chaining from version check
  • Loading branch information
DavidStrausz authored and wedgberto committed May 17, 2022
1 parent 4681cda commit 290cef4
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 1 deletion.
23 changes: 22 additions & 1 deletion bin/templates/cordova/lib/env/java.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,28 @@ const java = {
// Java <= 8 writes version info to stderr, Java >= 9 to stdout
let version = null;
try {
version = (await execa('javac', ['-version'], { all: true })).all;
const javacOutput = (await execa('javac', ['-version'], { all: true })).all;

/*
A regex match for the java version looks like the following:
version: [
'javac 1.8.0',
'1.8.0',
index: 45,
input: 'Picked up _JAVA_OPTIONS: -Xms1024M -Xmx2048M\njavac 1.8.0_271',
groups: undefined
]
We have to use a regular expression to get the java version, because on some environments
(e.g. macOS Big Sur) javac prints _JAVA_OPTIONS before printing the version and semver.coerce()
will fail to get the correct version from the output.
*/

const match = /javac\s+([\d.]+)/i.exec(javacOutput);
if (match && match[1]) {
version = match[1];
}
} catch (ex) {
events.emit('verbose', ex.shortMessage);

Expand Down
19 changes: 19 additions & 0 deletions spec/unit/check_reqs.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,25 @@ describe('check_reqs', function () {

await expectAsync(check_reqs.check_java()).toBeResolvedTo({ version: '1.8.0' });
});

it('should return the correct version if javac prints _JAVA_OPTIONS', async () => {
check_reqs.__set__({
java: {
getVersion: async () => {
let version = null;
const javacOutput = 'Picked up _JAVA_OPTIONS: -Xms1024M -Xmx2048M\njavac 1.8.0_271';
const match = /javac\s+([\d.]+)/i.exec(javacOutput);
if (match && match[1]) {
version = match[1];
}

return { version };
}
}
});

await expectAsync(check_reqs.check_java()).toBeResolvedTo({ version: '1.8.0' });
});
});

describe('check_android', function () {
Expand Down

0 comments on commit 290cef4

Please sign in to comment.