简体   繁体   English

切换到Android Studio 2.0后使用Dagger 2时出现NoClassDefFoundError

[英]NoClassDefFoundError When Using Dagger 2 After Switching to Android Studio 2.0

Before upgrading to Android Studio 2.0 I could use Dagger 2 no problem. 在升级到Android Studio 2.0之前,我可以使用Dagger 2没问题。 Now I am getting a NoClassDefFoundError This has shut me down for more than a day and I'm reaching out for some help. 现在我得到一个NoClassDefFoundError这让我关闭了一天以上,我正在寻求帮助。

It seems as though Gradle cannot my AppModule class even though it is pretty clear that it is in my project. 似乎Gradle不能用我的AppModule类,即使它很清楚它在我的项目中。 I have even included set multiDexEnabled true even though my project is only a few files. 我甚至包括set multiDexEnabled true即使我的项目只有几个文件。

Everything I can find online says that you can click your libraries to be imported. 我在网上找到的所有内容都表明您可以单击要导入的库。 Android Studio has no such luxury. Android Studio没有这样的奢侈品。

Any help would be greatly appreciated and you will have my undying loyalty. 任何帮助将不胜感激,你将获得我不懈的忠诚。

04-21 17:26:54.006 7875-7875/com.androidtitan.spotscoreapp E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.androidtitan.spotscoreapp, PID: 7875
java.lang.NoClassDefFoundError: com.androidtitan.spotscoreapp.main.injection.AppModule_ProvidesApplicationFactory
at com.androidtitan.spotscoreapp.main.injection.DaggerAppComponent.initialize(DaggerAppComponent.java:31)
at com.androidtitan.spotscoreapp.main.injection.DaggerAppComponent.<init>(DaggerAppComponent.java:23)
at com.androidtitan.spotscoreapp.main.injection.DaggerAppComponent.<init>(DaggerAppComponent.java:0)
at com.androidtitan.spotscoreapp.main.injection.DaggerAppComponent$Builder.build(DaggerAppComponent.java:66)
at com.androidtitan.spotscoreapp.App.onCreate(App.java:28)
at com.android.tools.fd.runtime.BootstrapApplication.onCreate(BootstrapApplication.java:326)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1020)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5010)
at android.app.ActivityThread.access$1600(ActivityThread.java:172)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1482)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5835)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)


package com.androidtitan.spotscoreapp.main.injection;

import android.app.Application;
import android.content.Context;

import javax.inject.Singleton;

import dagger.Module;
import dagger.Provides;

AppModule 的AppModule

@Module
public class AppModule {
private static Application application;

public AppModule(Application application) {
    this.application = application;
}

@Provides @Singleton
Application providesApplication() {
    return application;
}

@Provides @Singleton
Context providesApplicationContext() {
    return application.getBaseContext();
}
}

AppComponent AppComponent

package com.androidtitan.spotscoreapp.main.injection;

import android.app.Application;
import android.content.Context;

import com.androidtitan.spotscoreapp.main.ui.activity.LoginActivity;
import com.androidtitan.spotscoreapp.main.ui.fragment.LoginFragment;
import com.androidtitan.spotscoreapp.main.ui.fragment.SignUpFragment;

import javax.inject.Singleton;

import dagger.Component;

@Singleton
@Component(
    modules = { AppModule.class,
                LoginPresenterModule.class }
)
public interface AppComponent {
Application getApplication();
Context getApplicationContext();

void inject(LoginFragment activity);
}

App extends Application 应用扩展了应用

import android.app.Application;
import android.support.multidex.MultiDexApplication;

import com.androidtitan.spotscoreapp.main.injection.AppComponent;
import com.androidtitan.spotscoreapp.main.injection.AppModule;
import com.androidtitan.spotscoreapp.main.injection.DaggerAppComponent;
import com.firebase.client.Firebase;

import timber.log.Timber;

public class App extends Application {

private static AppComponent appComponent;

@Override
public void onCreate() {
    super.onCreate();

    Firebase.setAndroidContext(this);

    appComponent = DaggerAppComponent.builder()
            .appModule(new AppModule(this))
            .build();

    if (BuildConfig.DEBUG) {
        Timber.plant(new Timber.DebugTree());
    }

}

public static AppComponent getAppComponent(){
    return appComponent;
}
}

build.gradle(Module:App) 的build.gradle(模块:APP)

apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'

android {
compileSdkVersion 23
buildToolsVersion "24.0.0 rc1"

defaultConfig {
    applicationId "com.androidtitan.spotscoreapp"
    minSdkVersion 16
    targetSdkVersion 23
    versionCode 1
    versionName "1.0"
    multiDexEnabled true


}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

packagingOptions {
    exclude 'META-INF/DEPENDENCIES.txt'
    exclude 'META-INF/NOTICE'
    exclude 'META-INF/NOTICE.txt'
    exclude 'META-INF/LICENSE'
    exclude 'META-INF/LICENSE.txt'
}
}

dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
apt 'com.google.dagger:dagger-compiler:2.0'
compile 'com.android.support:multidex:1.0.0'

provided 'com.google.dagger:dagger-compiler:2.0'
provided 'org.glassfish:javax.annotation:10.0-b28'
compile 'com.android.support:appcompat-v7:23.3.0'
compile 'com.jakewharton.timber:timber:4.1.2'
compile 'com.android.support:design:23.3.0'
compile 'com.jakewharton:butterknife:7.0.1'
compile 'com.firebase:firebase-client-android:2.3.1'
}

build.gradle(Project:spotscoreapp) 的build.gradle(项目:spotscoreapp)

buildscript {
repositories {
    jcenter()
}
dependencies {
    classpath 'com.android.tools.build:gradle:2.0.0'
    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'

    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
}
}

allprojects {
repositories {
    jcenter()
}
}

task clean(type: Delete) {
delete rootProject.buildDir
}

AndroidManifest AndroidManifest

` `

<uses-permission android:name="android.permission.INTERNET" />

<application
    android:name=".App"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".main.ui.activity.LoginActivity"
        android:label="@string/title_activity_login"
        android:theme="@style/AppTheme.NoActionBar" />
    <activity android:name=".main.ui.activity.MainActivity" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

` `

I had a very similar issue and resolved it by doing pretty usual things in Android Studio. 我有一个非常类似的问题,通过在Android Studio中做很常见的事情来解决它。 You basically need to 你基本上需要

Invalidate Caches and then Clean Project

You know, Dagger2 generates a lot of code at compile time and sometimes things can mess up, especially if you are using Instant Run, provided by Android Studio 2.0 你知道,Dagger2在编译时会生成大量代码,有时会出现问题,特别是如果你使用Android Studio 2.0提供的Instant Run

Your Application doesn't extend from MultiDexApplication , nor does it do 您的Application不会从MultiDexApplication扩展,也不会扩展

@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    MultiDex.install(this);
}

And you should disable Instant Run. 你应该禁用Instant Run。

try to add class path "com.google.dagger:dagger:2.4" to the main project's build.gradle. 尝试将类路径“com.google.dagger:dagger:2.4”添加到主项目的build.gradle中。

NOTE: keep version number same as moudule's build.gradle 注意:保持版本号与moudule的build.gradle相同

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 在 Android Studio 上使用外部库时出现 NoClassDefFoundError - NoClassDefFoundError when using external libraries on Android Studio 切换到targetSdkVersion 28时的DefaultHttpClient NoClassDefFoundError(Android) - DefaultHttpClient NoClassDefFoundError when switching to targetSdkVersion 28 (Android) 使用Android Studio的活动NoClassDefFoundError - Activity NoClassDefFoundError using Android Studio Android Studio-使用JAR依赖项时发生NoClassDefFoundError(一个libGDX项目) - Android Studio - NoClassDefFoundError when using a JAR dependency (a libGDX project) 在 Android Studio 中使用带有 Kotlin 的 Dagger 2 时出错 - Error using Dagger 2 with Kotlin in Android Studio Dagger 2 在 Android Studio 库模块中使用 - Dagger 2 using in Android Studio Library Module 在Android Studio中找不到Dagger - Dagger not found in Android Studio 在手机上运行时,Android Studio应用程序NoClassDefFoundError - Android Studio Application NoClassDefFoundError when Running on Phone 在 Android 上使用 objenesis 时出现 NoClassDefFoundError - NoClassDefFoundError when using objenesis on Android 适用于Android Espresso内部匕首工厂类的NoClassDefFoundError - NoClassDefFoundError for Android Espresso internal dagger factory class
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM