mirror of
https://github.com/apache/cordova-android.git
synced 2025-02-22 00:32:55 +08:00
CB-7044 Add JAVA_HOME when not set. Be stricter about ANDROID_HOME
Also switches to using the which module over shelljs.which (better support for .bat files)
This commit is contained in:
parent
effffcba1d
commit
7133576fe9
@ -29,6 +29,14 @@ var shelljs = require('shelljs'),
|
|||||||
|
|
||||||
var isWindows = process.platform == 'win32';
|
var isWindows = process.platform == 'win32';
|
||||||
|
|
||||||
|
function forgivingWhichSync(cmd) {
|
||||||
|
try {
|
||||||
|
return which.sync(path);
|
||||||
|
} catch (e) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function tryCommand(cmd, errMsg) {
|
function tryCommand(cmd, errMsg) {
|
||||||
var d = Q.defer();
|
var d = Q.defer();
|
||||||
child_process.exec(cmd, function(err, stdout, stderr) {
|
child_process.exec(cmd, function(err, stdout, stderr) {
|
||||||
@ -80,32 +88,54 @@ module.exports.check_ant = function() {
|
|||||||
|
|
||||||
// Returns a promise.
|
// Returns a promise.
|
||||||
module.exports.check_java = function() {
|
module.exports.check_java = function() {
|
||||||
var javacInPath = !!shelljs.which('javac');
|
var javacPath = forgivingWhichSync('javac');
|
||||||
var hasJavaHome = !!process.env.JAVA_HOME;
|
var hasJavaHome = !!process.env['JAVA_HOME'];
|
||||||
// Windows java installer doesn't add javac to PATH, nor set JAVA_HOME (ugh).
|
return Q().then(function() {
|
||||||
if (hasJavaHome && !javacInPath) {
|
if (hasJavaHome) {
|
||||||
process.env.PATH += path.delimiter + path.join(process.env.JAVA_HOME, 'bin');
|
// Windows java installer doesn't add javac to PATH, nor set JAVA_HOME (ugh).
|
||||||
} else if (isWindows && (!hasJavaHome || !javacInPath)) {
|
if (!javacPath) {
|
||||||
// Try to auto-detect java in the default install paths.
|
process.env['PATH'] += path.delimiter + path.join(process.env['JAVA_HOME'], 'bin');
|
||||||
var firstJdkDir =
|
}
|
||||||
shelljs.ls(process.env.ProgramFiles + '\\java\\jdk*')[0] ||
|
} else {
|
||||||
shelljs.ls('C:\\Program Files\\java\\jdk*')[0] ||
|
if (javacPath) {
|
||||||
shelljs.ls('C:\\Program Files (x86)\\java\\jdk*')[0];
|
// OS X has a command for finding JAVA_HOME.
|
||||||
if (firstJdkDir) {
|
if (fs.existsSync('/usr/libexec/java_home')) {
|
||||||
// shelljs always uses / in paths.
|
return tryCommand('/usr/libexec/java_home', 'Failed to run: /usr/libexec/java_home')
|
||||||
firstJdkDir = firstJdkDir.replace(/\//g, path.sep);
|
.then(function(stdout) {
|
||||||
if (!javacInPath) {
|
process.env['JAVA_HOME'] = stdout.trim();
|
||||||
process.env.PATH += path.delimiter + path.join(firstJdkDir, 'bin');
|
});
|
||||||
|
} else {
|
||||||
|
// See if we can derive it from javac's location.
|
||||||
|
var maybeJavaHome = path.dirname(path.dirname(javacPath));
|
||||||
|
if (fs.existsSync(path.join(maybeJavaHome, 'lib', 'tools.jar'))) {
|
||||||
|
process.env['JAVA_HOME'] = maybeJavaHome;
|
||||||
|
} else {
|
||||||
|
throw new Error('Could not find JAVA_HOME. Try setting the environment variable manually');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (isWindows) {
|
||||||
|
// Try to auto-detect java in the default install paths.
|
||||||
|
var firstJdkDir =
|
||||||
|
shelljs.ls(process.env['ProgramFiles'] + '\\java\\jdk*')[0] ||
|
||||||
|
shelljs.ls('C:\\Program Files\\java\\jdk*')[0] ||
|
||||||
|
shelljs.ls('C:\\Program Files (x86)\\java\\jdk*')[0];
|
||||||
|
if (firstJdkDir) {
|
||||||
|
// shelljs always uses / in paths.
|
||||||
|
firstJdkDir = firstJdkDir.replace(/\//g, path.sep);
|
||||||
|
if (!javacPath) {
|
||||||
|
process.env['PATH'] += path.delimiter + path.join(firstJdkDir, 'bin');
|
||||||
|
}
|
||||||
|
process.env['JAVA_HOME'] = firstJdkDir;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
process.env.JAVA_HOME = firstJdkDir;
|
|
||||||
}
|
}
|
||||||
}
|
}).then(function() {
|
||||||
var msg =
|
var msg =
|
||||||
'Failed to run "java -version", make sure your java environment is set up\n' +
|
'Failed to run "java -version", make sure your java environment is set up\n' +
|
||||||
'including JDK and JRE.\n' +
|
'including JDK and JRE.\n' +
|
||||||
'Your JAVA_HOME variable is: ' + process.env.JAVA_HOME;
|
'Your JAVA_HOME variable is: ' + process.env['JAVA_HOME'];
|
||||||
return tryCommand('java -version', msg)
|
return tryCommand('java -version', msg)
|
||||||
.then(function() {
|
}).then(function() {
|
||||||
msg = 'Failed to run "javac -version", make sure you have a Java JDK (not just a JRE) installed.';
|
msg = 'Failed to run "javac -version", make sure you have a Java JDK (not just a JRE) installed.';
|
||||||
return tryCommand('javac -version', msg)
|
return tryCommand('javac -version', msg)
|
||||||
});
|
});
|
||||||
@ -113,18 +143,21 @@ module.exports.check_java = function() {
|
|||||||
|
|
||||||
// Returns a promise.
|
// Returns a promise.
|
||||||
module.exports.check_android = function() {
|
module.exports.check_android = function() {
|
||||||
var androidCmdPath = !!shelljs.which('android');
|
var androidCmdPath = forgivingWhichSync('android');
|
||||||
var adbInPath = !!shelljs.which('adb');
|
var adbInPath = !!forgivingWhichSync('adb');
|
||||||
var hasAndroidHome = !!process.env.ANDROID_HOME;
|
var hasAndroidHome = !!process.env['ANDROID_HOME'] && fs.existsSync(process.env['ANDROID_HOME']);
|
||||||
if (hasAndroidHome && !androidCmdPath) {
|
if (hasAndroidHome && !androidCmdPath) {
|
||||||
process.env.PATH += path.delimiter + path.join(process.env.ANDROID_HOME, 'tools');
|
process.env['PATH'] += path.delimiter + path.join(process.env['ANDROID_HOME'], 'tools');
|
||||||
}
|
}
|
||||||
if (androidCmdPath && !hasAndroidHome) {
|
if (androidCmdPath && !hasAndroidHome) {
|
||||||
process.env.ANDROID_HOME = path.dirname(path.dirname(androidCmdPath));
|
var parentDir = path.dirname(androidCmdPath);
|
||||||
hasAndroidHome = true;
|
if (path.basename(parentDir) == 'tools') {
|
||||||
|
process.env['ANDROID_HOME'] = path.dirname(parentDir);
|
||||||
|
hasAndroidHome = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (hasAndroidHome && !adbInPath) {
|
if (hasAndroidHome && !adbInPath) {
|
||||||
process.env.PATH += path.delimiter + path.join(process.env.ANDROID_HOME, 'platform-tools');
|
process.env['PATH'] += path.delimiter + path.join(process.env['ANDROID_HOME'], 'platform-tools');
|
||||||
}
|
}
|
||||||
|
|
||||||
var valid_target = this.get_target();
|
var valid_target = this.get_target();
|
||||||
@ -136,6 +169,13 @@ module.exports.check_android = function() {
|
|||||||
' (the Android newest SDK). Make sure you have the latest Android tools installed as well.' +
|
' (the Android newest SDK). Make sure you have the latest Android tools installed as well.' +
|
||||||
' Run "android" from your command-line to install/update any missing SDKs or tools.'));
|
' Run "android" from your command-line to install/update any missing SDKs or tools.'));
|
||||||
}
|
}
|
||||||
|
}).then(function() {
|
||||||
|
if (!process.env['ANDROID_HOME']) {
|
||||||
|
throw new Error('ANDROID_HOME is not set and "android" command not in your PATH. You must fulfill at least one of these conditions.');
|
||||||
|
}
|
||||||
|
if (!fs.existsSync(process.env['ANDROID_HOME'])) {
|
||||||
|
throw new Error('ANDROID_HOME is set to a non-existant path: ' + process.env['ANDROID_HOME']);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user