Idea导入gradle项目报错,错误信息如下:
java.lang.AbstractMethodError: org.jetbrains.plugins.gradle.tooling.util.ModuleComponentIdentifierImpl.getModuleIdentifier()Lorg/gradle/api/artifacts/ModuleIdentifier;
在尝试解决这个问题之前,我们首先要明白java.lang.AbstractMethodError
是什么。从AbstractMethodError的文档可以看到“Thrown when an application tries to call an abstract method”,也就是说当一个抽象方法被调用的时候回抛出这个异常。但是为什么抽象方法会被调用呢?
下图就展示了这个情况:
首先,在编译期间,我们在ClassA里引用版本1的ClassB的method1方法,在这个版本里,method1还是有具体实现的,编译也能够正常进行,所以我们给ClassA所在的包打包成一个jar包。但是,在我们引入ClassB的时候,ClassB这时候进行了版本升级,ClassB变成了抽象类,method1方法也变成了抽象(Abstract)方法,这个时候ClassA再去调用ClassB的method1才发现已经没有对应的实现了,所以才会抛出
java.lang.AbstractMethodError
。这种情况下,因为没有重新编译,所以这个错误到运行期才出现。
那么,对应到我们这个问题上来,就是gradle在升级的时候,有jar包出现了版本兼容的问题。从gradle的这个issuse可以看到,gradle 5目前对Android Studio和intelliJ都有兼容性问题,目前建议的解决方案是降级到版本4。
我在intelliJ上的解决方案是:IntelIiJ IDEA -> Preferences -> Build,Execution, Deployment -> Build Tools -> Gradle,勾选`Use gradle 'wrapper' task configuration',重新导入,gradle任务就可以正常执行了。