CB-14101 Fix Java version check for Java >= 9 (#446)

This also checks that we have exactly 1.8 since nothing else works with
the Android SDK. The user facing error was updated accordingly.
This commit is contained in:
Raphael von der Grün 2018-06-12 22:18:55 +02:00 committed by GitHub
parent 3df8f8b120
commit bf29fe0e10
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -39,17 +39,6 @@ function forgivingWhichSync (cmd) {
} }
} }
function tryCommand (cmd, errMsg, catchStderr) {
var d = Q.defer();
child_process.exec(cmd, function (err, stdout, stderr) {
if (err) d.reject(new CordovaError(errMsg));
// Sometimes it is necessary to return an stderr instead of stdout in case of success, since
// some commands prints theirs output to stderr instead of stdout. 'javac' is the example
else d.resolve((catchStderr ? stderr : stdout).trim());
});
return d.promise;
}
module.exports.isWindows = function () { module.exports.isWindows = function () {
return (os.platform() === 'win32'); return (os.platform() === 'win32');
}; };
@ -205,18 +194,21 @@ module.exports.check_java = function () {
} }
} }
}).then(function () { }).then(function () {
return Q.denodeify(child_process.exec)('javac -version')
.then(outputs => {
// outputs contains two entries: stdout and stderr
// Java <= 8 writes version info to stderr, Java >= 9 to stdout
const output = outputs.join('').trim();
const match = /javac\s+([\d.]+)/i.exec(output);
return match && match[1];
}, () => {
var msg = var msg =
'Failed to run "javac -version", make sure that you have a JDK installed.\n' + 'Failed to run "javac -version", make sure that you have a JDK installed.\n' +
'You can get it from: http://www.oracle.com/technetwork/java/javase/downloads.\n'; 'You can get it from: http://www.oracle.com/technetwork/java/javase/downloads.\n';
if (process.env['JAVA_HOME']) { if (process.env['JAVA_HOME']) {
msg += 'Your JAVA_HOME is invalid: ' + process.env['JAVA_HOME'] + '\n'; msg += 'Your JAVA_HOME is invalid: ' + process.env['JAVA_HOME'] + '\n';
} }
// We use tryCommand with catchStderr = true, because throw new CordovaError(msg);
// javac writes version info to stderr instead of stdout
return tryCommand('javac -version', msg, true).then(function (output) {
// Let's check for at least Java 8, and keep it future proof so we can support Java 10
var match = /javac ((?:1\.)(?:[8-9]\.)(?:\d+))|((?:1\.)(?:[1-9]\d+\.)(?:\d+))/i.exec(output);
return match && match[1];
}); });
}); });
}; };
@ -364,8 +356,8 @@ module.exports.run = function () {
console.log('ANDROID_HOME=' + process.env['ANDROID_HOME']); console.log('ANDROID_HOME=' + process.env['ANDROID_HOME']);
console.log('JAVA_HOME=' + process.env['JAVA_HOME']); console.log('JAVA_HOME=' + process.env['JAVA_HOME']);
if (!values[0]) { if (!String(values[0]).startsWith('1.8.')) {
throw new CordovaError('Requirements check failed for JDK 1.8 or greater'); throw new CordovaError('Requirements check failed for JDK 1.8');
} }
if (!values[1]) { if (!values[1]) {