切换到Android Studio 2.0后使用Dagger 2时出现NoClassDefFoundError [英] NoClassDefFoundError When Using Dagger 2 After Switching to Android Studio 2.0
问题描述
在升级到Android Studio 2.0之前,我可以使用Dagger 2没问题.现在,我得到一个NoClassDefFoundError
,这使我关闭了一天多,我正在寻求帮助.
Before upgrading to Android Studio 2.0 I could use Dagger 2 no problem. Now I am getting a NoClassDefFoundError
This has shut me down for more than a day and I'm reaching out for some help.
即使很显然Gradle不在我的项目中,似乎Gradle也无法实现我的AppModule
类.即使我的项目只有几个文件,我甚至都包含了set multiDexEnabled true
.
It seems as though Gradle cannot my AppModule
class even though it is pretty clear that it is in my project. I have even included set multiDexEnabled true
even though my project is only a few files.
我在网上找到的所有内容都表明您可以单击要导入的库. Android Studio没这么奢侈.
Everything I can find online says that you can click your libraries to be imported. Android Studio has no such luxury.
任何帮助将不胜感激,您将拥有我永恒的忠诚.
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(Module: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(Project: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>
`
推荐答案
我遇到了一个非常相似的问题,并通过在Android Studio中执行一些非常平常的操作来解决了该问题.您基本上需要
I had a very similar issue and resolved it by doing pretty usual things in Android Studio. You basically need to
Invalidate Caches and then Clean Project
您知道,Dagger2在编译时会生成很多代码,有时情况会变得混乱,特别是如果您使用的是由Android Studio 2.0提供的Instant Run
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
这篇关于切换到Android Studio 2.0后使用Dagger 2时出现NoClassDefFoundError的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!