[英]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.