aar
在项目中运行良好,然后将其转换为库模块,并将其添加到一个简单的项目中以测试其是否正常运行
错误:
“ java.lang.NoClassDefFoundError:无法解决以下问题: Lcom / google / gson / Gson;“
我已经将Gson
添加到了aar中,但是在开始活动时(它在aar中)它给了我这个错误
如何解决?
答案 0 :(得分:1)
使用此依赖项而不是* .aar文件。
实现'com.google.code.gson:gson:2.8.5'
答案 1 :(得分:0)
Tl; dr:可能发生的事情是,您将Gson作为compileOnly
依赖项包括在内。改用implementation
修复它。
您的模块可以使用多种方法来声明对另一个库模块的依赖。
implementation
Gradle将依赖项添加到编译类路径中,并将该依赖项打包到生成输出中。但是,当您的模块配置
implementation
依赖项时,它会让Gradle知道您不希望该模块在编译时将依赖项泄漏给其他模块。也就是说,该依赖项仅在运行时可用于其他模块。
这意味着您可以从库中引用代码,并且该库打包到您的apk中。 它没有打包在库aar中。它作为传递依赖项存储在元数据中。
如果您有一个通过implementation
依赖于Gson的应用程序模块App和库模块Lib,那么Lib可以看到Gson但App无法。 Gson将成为Lib模块的隐藏实现。
api
Gradle将依赖项添加到编译类路径并生成输出。当模块包含
api
依赖项时,它使Gradle知道该模块希望将该依赖项可传递地导出到其他模块,以便它们在运行时和编译时都可用。
与implementation
相同,除了Gson将公开为Lib的API,因此您可以从App中使用它。
compileOnly
Gradle仅将依赖项添加到编译类路径中(也就是说,它不会添加到构建输出中)。当您创建Android模块并且在编译过程中需要依赖项时,这很有用,但是在运行时显示依赖项是可选的。
这意味着您可以从库中引用代码,但是该库不打包到您的apk 中。
一个示例是Android SDK。您根据API 28 SDK进行了编译,使用了API,但并未将SDK打包在您的apk中。手机或模拟器中已经装有Android运行时。
了解更多:https://developer.android.com/studio/build/dependencies
答案 2 :(得分:0)
解决方案是在测试项目中添加“实现'com.google.code.gson:gson:2.8.5'”,这解决了我的问题,但我还是不喜欢它;)
答案 3 :(得分:-1)
您还必须将库(aar)的所有依赖项添加到应用程序的build.gradle中。库不包括其依赖项。