_ensure: async()

in lib/env/java.js [74:126]


    _ensure: async (environment) => {
        if (javaIsEnsured) {
            return;
        }

        const javaHome = environment.CORDOVA_JAVA_HOME || environment.JAVA_HOME;
        if (javaHome) {
            // Ensure that CORDOVA_JAVA_HOME overrides
            environment.JAVA_HOME = javaHome;
            // Ensure that the JAVA_HOME bin path is before anything else
            // to cover cases where different Java versions is in the PATH
            environment.PATH = path.join(environment.JAVA_HOME, 'bin') + path.delimiter + environment.PATH;
        } else {
            const javacPath = utils.forgivingWhichSync('javac');
            if (javacPath) {
                // OS X has a command for finding JAVA_HOME.
                const find_java = '/usr/libexec/java_home';
                const default_java_error_msg = 'Failed to find \'JAVA_HOME\' environment variable. Try setting it manually.';
                if (fs.existsSync(find_java)) {
                    try {
                        environment.JAVA_HOME = (await execa(find_java)).stdout;
                    } catch (ex) {
                        events.emit('verbose', ex.shortMessage);
                        throw new CordovaError(default_java_error_msg);
                    }
                } else {
                    // See if we can derive it from javac's location.
                    const maybeJavaHome = path.dirname(path.dirname(javacPath));
                    if (fs.existsSync(path.join(maybeJavaHome, 'bin', 'java')) ||
                            fs.existsSync(path.join(maybeJavaHome, 'bin', 'java.exe'))) {
                        environment.JAVA_HOME = maybeJavaHome;
                    } else {
                        throw new CordovaError(default_java_error_msg);
                    }
                }
            } else if (utils.isWindows()) {
                const baseDirs = [environment.ProgramFiles, environment['ProgramFiles(x86)']];
                const globOpts = { absolute: true, onlyDirectories: true };
                const flatMap = (arr, f) => [].concat(...arr.map(f));
                const jdkDir = flatMap(baseDirs, cwd => {
                    return glob.sync('java/jdk*', { cwd, ...globOpts });
                }
                )[0];

                if (jdkDir) {
                    environment.PATH += path.delimiter + path.join(jdkDir, 'bin');
                    environment.JAVA_HOME = path.normalize(jdkDir);
                }
            }
        }

        javaIsEnsured = true;
    }