将 Gradle 2.1.0 更新到 2.2.1 后出现 NoClassDefFoundError
Posted
技术标签:
【中文标题】将 Gradle 2.1.0 更新到 2.2.1 后出现 NoClassDefFoundError【英文标题】:NoClassDefFoundError after updating Gradle 2.1.0 to 2.2.1 【发布时间】:2016-10-24 13:17:09 【问题描述】:我的库是 aar 文件。将根 gradle 类路径 2.1.0 更改为 2.2.1 后,出现 NoClassDefFoundError 错误。
例如:我在我的 aar 库中创建了一个新类,之后我同步并且我的主应用程序看到了我的类,但是当我运行应用程序时,在运行时它给了我 NoClassDefFoundError。
Ps:更新后gradle下载的是2.14.1。
threadid=1: thread exiting with uncaught exception (group=0xa4ca8b20)
: java.lang.NoClassDefFoundError: com.gk.lib.ui.Utils
: at com.example.activities.MainActivity.onCreate(MainActivity.java:78)
: at android.app.Activity.performCreate(Activity.java:5231)
: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148)
: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
: at android.app.ActivityThread.access$800(ActivityThread.java:135)
: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
: at android.os.Handler.dispatchMessage(Handler.java:102)
: at android.os.Looper.loop(Looper.java:136)
: at android.app.ActivityThread.main(ActivityThread.java:5001)
: at java.lang.reflect.Method.invokeNative(Native Method)
: at java.lang.reflect.Method.invoke(Method.java:515)
: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
: at dalvik.system.NativeStart.main(Native Method)
在我的 MainActivity 类中,我使用这样的静态方法调用方法:
Utils.gkTestMethod();
我的 Utils 类:
import android.util.Log;
public class Utils
public static void gkTestMethod()
Log.v("Log","Log");
不管我叫什么类。如果我创建新类,则会出现此错误。
谢谢。
【问题讨论】:
添加完整的堆栈跟踪 我更新了我的问题。你可以看到。@Jens 你的 MainActivity.java 文件第 78 行有什么? @AleksG 我添加了我的课程。 这意味着编译器找不到类Utils
【参考方案1】:
关于这个sn-p在主build.gradle
:
dependencies compile('com.gk.lib:common:1.0.0') transitive = true compile('com.gk.lib:ui:1.0.0') transitive = true exclude module: 'common' compile('com.gk.lib:components:1.0.0') transitive = true exclude module: 'common' exclude module: 'ui' // Other dependencies
似乎components
依赖于common
和ui
,而ui
依赖于common
。是否有充分的理由明确排除然后重新包含传递依赖项?我认为这应该可行:
dependencies
compile 'com.gk.lib:components:1.0.0'
// Other dependencies
而且 IIRC common
不是可传递的。
【讨论】:
我没有把编译调试和发布常见依赖。我改变了我的帖子,你可以看到新版本。我划分公共依赖项是因为我需要在调试或发布时包含一些 c 文件,这些文件是不同的。 @GörkemKaradoğan 请添加每个库的完整且未修改的build.gradle
我改变了我的帖子,因为我说所有的图书馆 gradle 都是相似的。【参考方案2】:
我不敢相信 multidex 支持解决了我的问题。为什么我以前不这么认为:/ 谢谢。
https://developer.android.com/studio/build/multidex.html
【讨论】:
以上是关于将 Gradle 2.1.0 更新到 2.2.1 后出现 NoClassDefFoundError的主要内容,如果未能解决你的问题,请参考以下文章
将 gradle 更新到 7.0.3 后 buildConfigField 不起作用
将 gradle 更新到 7.0.2 后运行 Gitlab 管道失败
将 Android Studio 3.6 和 Gradle 更新到 3.5.0 后无法运行项目