祖国大地经济复苏,全国各族人民都积极投入到了复产任务。作为码农的我也紧张了一大段时间,最近在忙几个项目,其中有个app,需要快速搭建预览和测试,于是就直接上了cordova,没想到踩到雷了。
搭建项目没什么问题,只是构建的时候给我来了这么一段:
Requirements check failed for JDK 8 ('1.8.*')! Detected version:11.0.7
Check your ANDROID_SDK_ROOT / JAVA_HOME / PATH environment variables.
提示很明确了,本机jdk11不符合cordova的必需jdk8。原因也清楚,因为前一阵本机环境从jdk8升级到了jdk11。
现在的问题是,我不想再将java_home换回8,因为本机所有项目编译版本都全部更改成了jdk11,如果改回去,没半天时间改不完。(还有很多Eclipse里的历史项目)
我使用的cordova@9.0.0,这个版本是一年前发布的,但是npm里最新的cordova10,还处于nightly版(每日编译版),连rc都不是,明显在生产环境下是不建议用的。也就是说,cordova9是最新稳定版,我不能寄希望于升级cordova改变现状。
另外尝试过在IDE(vscode)里设置java.home,不过没用,这个设置只针对vsc的java插件有效,对cordova无能为力。
想来想去,如果不能让cordova屈服,我就只能面临回退到jdk8的厄运。
因为cordova基于的nodejs,突然想到,所有的提示都应该存在于明文代码。于是一狠心,全项目搜索关键字Requirements check failed for。
还真就检索到了:
位于platforms/android/cordova/lib/check_reqs.js文件里的module.exports.run方法里,相关的有且仅有一处!
它的判断是这样的:
// Returns a promise.
module.exports.run = function () {
return Q.all([this.check_java(), this.check_android()]).then(function (values) {
console.log('Checking Java JDK and Android SDK versions');
console.log('ANDROID_SDK_ROOT=' + process.env['ANDROID_SDK_ROOT'] + ' (recommended setting)');
console.log('ANDROID_HOME=' + process.env['ANDROID_HOME'] + ' (DEPRECATED)');
if (!String(values[0]).startsWith('1.8.')) {
throw new CordovaError(
'Requirements check failed for JDK 8 (\'1.8.*\')! Detected version: ' + values[0] + '\n' +
'Check your ANDROID_SDK_ROOT / JAVA_HOME / PATH environment variables.'
);
}
if (!values[1]) {
throw new CordovaError('Requirements check failed for Android SDK! Android SDK was not detected.');
}
});
};
看到了这个1.8的判断条件,同时根据check_java方法也可以明确为判断java环境。于是把“1.8.”直接改成了“11.”,再次编译顺利通过。
后记:
首先我是不推荐任意更改依赖框架源码的,这样不但会影响框架后续更新,也会造成一些未知异常。但没办法,此处仅作为临时解决方案。
我不清楚cordova9是否有只依赖jdk8的关键部分,我也不清楚jdk11会对cordova9造成什么影响,但是我想的很清楚,不管如何要让影响降低到最小,改一处代码,这个影响就真的很小。