实际上本次的问题主要难在问题定位上。当你发现问题是Android Studio不能找到jar包时,已经成功了一半了。
场景
同样是出现在导入项目的时候。项目已经导入成功。AutoSync也没有出现问题。当我信心满满的build项目时。报了一个奇怪的错误: 这个报错,描述的是该语句中的 .getVolumes() 方法无法被识别。该方法被封装到了公司提供的某个jar包中,但是一般的jar包在build过程中都能顺利导入。于是我去询问了一下同事。得知,公司重写了SDK28, .getVolumes() 正是保存在重写后的jar包中,而AS在build的过程中没有找到这个包的路径,因此使用了自带的SDK,自然就无法找到这个方法了。 那么接下来只需要在APP目录下的build.gradle中,在dependencies中配置:
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
compileOnly files('libs/xxxxxxxxxxxxxx.jar')
}
应该就可以顺利编译通过了。估计很多时候到这一步问题也就解决了。 可惜这次偏偏没有这么简单。还是报了上述同样的错误。期间有进行 clean project 、 rebuild 等操作,还是找不到jar包。无奈之下再次询问同事。得知,除了需要在 APP目录下的build.gradle 中配置依赖,还需要在 根目录下的build.gradle 中配置如下依赖:
allprojects {
tasks.withType(JavaCompile){
options.compilerArgs.add('-Xbootclasspath/p:xxxxxxxxxxxx.jar')
}
}
配置好后,进行clean project、rebuild等操作,结果还是不行。期间还出现了上一篇文章提到的问题Missing essential plugin.,气得我卸载了 Android Studio4.2.2 ,用公司自带的安装包重装了一遍AS,装好后发现是远古版本3.2。然而,在 Android Studio3.2 版本中,我居然成功build了项目。 我和我的同事都满脸问号。在AS3.2中直接 Update到4.2.2 版本,项目居然又不行了! 在快要崩溃的时候,同事指出, 根目录下的build.gradle 中配置的地址是相对地址,也许是AS版本更迭的原因,相对地址和绝对地址的适配成都不同。如果改成绝对地址,说不定就可以了。于是我改成绝对地址,重新build,一波三折,总算成功!
allprojects {
tasks.withType(JavaCompile){
options.compilerArgs.add('-Xbootclasspath/D\\xxx\\xxx\\xxxxxxxxx\\xxxxxxxxxxxx.jar')
}
}
出现原因
jar包没有导入成功,依赖没有产生,导致jar包内部函数无法被调用。
处理方式
1.一般来说,只需要将jar包放入项目的 libs 目录下,然后在project目录中右键该jar包,选择 “Add as library” ,即可导入成功。 2.当出现场景中的情况时,需要在 APP目录下的build.gradle 文件中配置如下代码:
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
compileOnly files('libs/xxxxxxxxxxxxxx.jar')
}
3.如果第二步仍无法解决该问题,那么继续在 根目录下的build.gradle 文件中配置如下代码:
allprojects {
tasks.withType(JavaCompile){
options.compilerArgs.add('-Xbootclasspath/p:xxxxxxxxxxxx.jar')
}
}
要注意,这里使用的是相对地址,也可以使用绝对地址,只需要替换 p:xxxxxxxxxxxx.jar 部分即可。
4.重新编译时,最好先 clean project ,再进行build操作。
问题解析
本问题仍是出现在项目导入编译的过程中。据我与同事的讨论。认为主要原因如下: 1.项目将SDK重写后封装成了新的jar包,而Android Studio在没有强行配置新jar包的依赖时,会优先指向自带的SDK,因此导致找不到内部方法,build失败。 2.不同版本的Android Studio对绝对路径和相对路径的识别程度不同。确认路径配置没有问题的情况下仍无法通过,则可以考虑改为绝对路径。 3.实际上本次的问题主要难在问题定位上。当你发现问题是jar包不能成功导入时,已经成功了一半了。
|