原因
一般是打包Module的本地依赖没有打包到aar
解决
- 第一步 报错信息
我遇到报错所在的类为 com.rongzl.recognition.MQTTDoor - 第二步 找到部署后SDK对应的类 所在的import列表
很明显MQTTDoor类是存在的,居然报 java.lang.NoClassDefFoundError: 错误,注意这个错误并不是 NoClassDefFoundError:
- java.lang.NoClassDefFoundError: 错误
NoClassDefFoundError错误的发生,是因为Java虚拟机在编译时能找到合适的类,而在运行时不能找到合适的类导致的错误。例如在运行时我们想调用某个类的方法或者访问这个类的静态成员的时候,发现这个类不可用,此时Java虚拟机就会抛出NoClassDefFoundError错误。
- NoClassDefFoundError: 错误
NoClassDefFoundError发生在JVM在动态运行时,根据你提供的类名,在classpath中找到对应的类进行加载,但当它找不到这个类时,就发生了java.lang.NoClassDefFoundError的错误,而ClassNotFoundException是在编译的时候在classpath中找不到对应的类而发生的错误。ClassNotFoundException比NoClassDefFoundError容易解决,是因为在编译时我们就知道错误发生,并且完全是由于环境的问题导致。
- 区别
与ClassNotFoundException的不同在于,这个错误发生只在运行时需要加载对应的类不成功,而不是编译时发生。很多Java开发者很容易在这里把这两个错误搞混。
- 第三步
即我的com.rongzl.recognition.MQTTDoor类可以编译通过无报错,但无法运行。且有类加载不成功。以此进入import类列表发现org.eclipse.paho.client.mqttv3这个module在SDK中不存在
快速解决办法是在所部署项目的build.grade中添加未打入SDK的依赖,这样需要在SDK文档中增加说明,这种方式不是严格的
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'
严格的解决方式是将项目中依赖打包进aar
相关资源 aar打包无法引用三方依赖问题