将 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 依赖于commonui,而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 依赖项更新到最新版本

将 gradle 更新到 7.0.3 后 buildConfigField 不起作用

将 gradle 更新到 7.0.2 后运行 Gitlab 管道失败

将 Android Studio 3.6 和 Gradle 更新到 3.5.0 后无法运行项目

将 android studio 更新到 4.2 Beta1 后,Gradle 构建失败

更新到3.0后,Gradle构建失败