GSON / Gradle:3模块Android Studio项目中的java.lang.NoClassDefFoundError

时间:2018-02-10 03:07:19

标签: java android gradle gson

我知道有几十个人(like this one)发布了相同的堆栈跟踪,但在完成每个人之后,我仍然缺少解决方案。我有一个我正在研究的学校项目,我们正在Android Studio中构建(Gradle是构建工具)依赖于Gson。它由三个模块构成:

  • app(由Android Studio生成的Android应用)
  • server(应用将指示其来电的服务器)
  • shared(服务器和应用程序都依赖的类)

appserver在build.gradle依赖项中都有以下行:

implementation project(':shared')

所以两者都取决于shared。反过来,sharedshared/libs中有gson-2.6.2.jar(虽然我已经尝试删除它并使用远程存储库),并且所有这三个都将此作为依赖:< / p>

implementation fileTree(dir: 'libs', include: ['*.jar'])

shared中有一个名为Serializer的班级使用Gson。但是当我在Android Studio中运行server模块并调用Serializer时,我得到了这个堆栈跟踪:

Exception in thread "Thread-2" java.lang.NoClassDefFoundError: com/google/gson/Gson
    at my.t2r.comm.Serializer.<init>(Serializer.java:25)
...
Caused by: java.lang.ClassNotFoundException: com.google.gson.Gson
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 13 more

Stack Overflow上的解决方案专注于确保依赖项位于build.gradle文件中并清理和重建项目。我已经尝试在所有三个模块中单独包含对Gson的依赖,尝试使用远程Gson,并且无数次地清理和重建。我总是能够在编码时使用Gson,但它拒绝在运行时工作。我很茫然,任何帮助都会受到赞赏!

应用程序/的build.gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    defaultConfig {
        applicationId "my.t2r"
        minSdkVersion 24
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    buildToolsVersion '26.0.2'
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
    implementation project(':shared')
    compile 'com.android.support:recyclerview-v7:26.1.0'
    compile 'com.bignerdranch.android:expandablerecyclerview:1.0.3'
}

服务器/的build.gradle:

apply plugin: 'java-library'

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation project(':shared')
    testImplementation 'junit:junit:4.12'
    implementation 'com.google.code.gson:gson:2.8.2' // I've also tried api instead
}

sourceCompatibility = "1.7"
targetCompatibility = "1.7"

共享/的build.gradle:

apply plugin: 'java-library'

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    testImplementation 'junit:junit:4.12'
    implementation 'com.google.code.gson:gson:2.8.2' // I've also tried api instead
}

sourceCompatibility = "1.7"
targetCompatibility = "1.7"

编辑:更新以表明我正在使用该指令来使用远程而不是libs /

3 个答案:

答案 0 :(得分:0)

app\build.gradle

中添加此依赖项
implementation 'com.google.code.gson:gson:2.8.2'

答案 1 :(得分:0)

我找到了答案!

我假设IDE出了问题。当我在IDEA而不是Android Studio中加载项目时,Gson依赖项的范围是提供而不是编译。不幸的是,在Android Studio中,没有办法看到这些设置。经过几个小时的谷歌搜索不同,我终于找到了这个答案in an SO chat room:

artifacts.add("default", file('libs/gson-2.6.2.jar'))

将此行添加到shared/build.gradle(不在任何括号内,只是免费)解决了我的问题!我在server/build.gradle中没有需要任何更改。

答案 2 :(得分:0)

我有同样的问题,没有什么比清理或缓存invaidates或Gradle更改有帮助。最后,事实证明它是一个模拟器实例(API 19)独有的。其他仿真器和物理设备都可以正常工作。