为啥 lib 模块不能在 android studio 中包含第三个 lib

Posted

技术标签:

【中文标题】为啥 lib 模块不能在 android studio 中包含第三个 lib【英文标题】:Why the lib module can't include the 3rd lib in android studio为什么 lib 模块不能在 android studio 中包含第三个 lib 【发布时间】:2017-07-14 22:29:57 【问题描述】:

我有一个问题 “java.lang.NoClassDefFoundError:解析失败:Lorg/apache/commons/lang/StringUtils;” 当我尝试运行依赖于我自己的 android 库的 android 应用程序时。 以下是我的步骤: 创建了一个android项目,然后在其中构建了一个名为“sptvlib”的新模块。 此模块依赖于名为“common-lang”的第 3 方库,它是一个 String utils 库。请参阅“sptvlib”gradle 文件:

dependencies 
   ...
   compile 'org.apache.directory.studio:org.apache.commons.lang:2.6'
   ...

构建整个项目后,我得到了模块sptvlib.aar文件,并将其复制到另一个android应用项目的“libs”目录中。

repositories 
    flatDir 
        dirs 'libs'
    

dependencies 
...
    compile(name: 'sptvlib', ext: 'aar')
...

我成功构建了这个应用程序,但是当它运行时,logcat 显示“java.lang.NoClassDefFoundError”错误。 我必须将“commons.lang”声明重新添加到应用程序项目 gradle,然后它运行正常......我们已将第 3 方库添加到我的模块中,使用“已编译”。为什么依赖我自己的模块的应用程序仍然无法在运行时找到它?

【问题讨论】:

【参考方案1】:

我假设您在主应用程序项目中使用了 commons.lang 的某些功能。

由于您使用的是 sptvlib 库的已编译汇编代码,因此您可以在主应用项目中使用 sptvlib 的已编译公开函数。

但是您不能直接在您的主应用项目中访问 c​​ommons.lang 的库函数。 这是因为您尚未将 sptvlib 代码作为模块添加到您的应用项目中。您只使用了 sptvlib 的编译版本。

【讨论】:

所以...我构建的“sptvlib.aar”不是真正的库,如“rxjava”和“retrofit”等...如果其他一些应用程序使用“ sptvlib”依赖于“commons.lang”库并运行正常,我们需要在每个应用程序项目中创建一个新模块并在其中复制“sptvlib”代码,还是我弄错了?你能有一些样本来帮助我吗?如何创建一个“真正的”库?谢谢^_^ 如果其他一些应用程序使用依赖于“commons.lang”库的“sptvlib”的功能应该可以正常工作。但是你不能直接在应用中使用“commons.lang”的功能。 我的应用不直接使用3rd lib的功能,只调用sptvlib的一些依赖3rd lib的方法...

以上是关于为啥 lib 模块不能在 android studio 中包含第三个 lib的主要内容,如果未能解决你的问题,请参考以下文章

为啥编译时库模块中的包不存在,即使 Android Studio 显示代码中没有错误?

为啥我不能 cd 进入 /var/lib/mysql

为啥 Eclipse 不能识别 $PERL5LIB?

为啥我会收到此错误:模块构建失败(来自 ./node_modules/babel-loader/lib/index.js):语法错误 Unexpected token, expected "

为啥dll不能在c++中使用?

为啥我不能在不同的模块中加载泡菜?