【发布时间】:2016-03-17 02:59:22
【问题描述】:
我正在使用 Dagger 2 来创建我的依赖注入。几个小时前它还在工作,但现在不再生成组件。
这里是我创建组件的地方:
public class App extends Application {
CacheComponent mCacheComponent;
ApiComponent mApiComponent;
DataBaseComponent mDataBaseComponent;
@Override
public void onCreate() {
super.onCreate();
mCacheComponent = DaggerCacheComponent.builder()
.cacheModule(new CacheModule(getApplicationContext()))
.build();
mApiComponent = DaggerApiComponent.builder()
.apiModule(new ApiModule())
.build();
mDataBaseComponent = DaggerDataBaseComponent.builder()
.dataBaseModule(new DataBaseModule(getApplicationContext()))
.build();
}
public CacheComponent getCacheComponent(){ return mCacheComponent;}
public ApiComponent getApiComponent() { return mApiComponent; }
public DataBaseComponent getDataBaseComponent() { return mDataBaseComponent;}
}
这可以正常工作,但现在出现错误:
E:\AndroidProject\JoinTV\app\src\main\java\com\myproject\jointv\utils\App.java:7: error: cannot find symbol
import com.myproject.jointv.component.DaggerApiComponent;
^
symbol: class DaggerApiComponent
location: package com.myproject.jointv.component
E:\AndroidProject\JoinTV\app\src\main\java\com\myproject\jointv\utils\App.java:8: error: cannot find symbol
import com.myproject.jointv.component.DaggerCacheComponent;
^
symbol: class DaggerCacheComponent
location: package com.myproject.jointv.component
E:\AndroidProject\JoinTV\app\src\main\java\com\myproject\jointv\utils\App.java:9: error: cannot find symbol
import com.myproject.jointv.component.DaggerDataBaseComponent;
^
symbol: class DaggerDataBaseComponent
location: package com.myproject.jointv.component
Note: Resolve log file to E:\AndroidProject\JoinTV\app\build\generated\source\apt\androidannotations.log
Note: Initialize AndroidAnnotations 3.3.2 with options {androidManifestFile=E:\AndroidProject\JoinTV\app\build\intermediates\manifests\full\debug\AndroidManifest.xml, resourcePackage
Name=com.myproject.jointv}
Note: Start processing for 5 annotations on 32 elements
Note: AndroidManifest.xml file found with specified path: E:\AndroidProject\JoinTV\app\build\intermediates\manifests\full\debug\AndroidManifest.xml
Note: AndroidManifest.xml found: AndroidManifest [applicationPackage=com.myproject.jointv, componentQualifiedNames=[com.myproject.jointv.activities.MainActivity_, com.myproject
.jointv.activities.YoutubePlayerViewActivity, com.myproject.jointv.activities.VideoPlayerActivity_, com.myproject.jointv.services.ServiceDownloaderPlayList], permissionQualifiedN
ames=[android.permission.INTERNET, android.permission.WRITE_EXTERNAL_STORAGE], applicationClassName=com.myproject.jointv.utils.App, libraryProject=false, debugabble=false, minSdkVe
rsion=21, maxSdkVersion=-1, targetSdkVersion=23]
Note: Found project R class: com.myproject.jointv.R
Note: Found Android class: android.R
Note: Validating elements
Note: Validating with EActivityHandler: [com.myproject.jointv.activities.MainActivity, com.myproject.jointv.activities.VideoPlayerActivity]
Note: Validating with EFragmentHandler: [com.myproject.jointv.fragments.VideoPlayerFragment]
Note: Validating with ViewByIdHandler: [buttonPlay, videoView, videoView]
Note: Validating with FragmentArgHandler: [url, cachePath]
Note: Validating with AfterViewsHandler: [onViewInjected(), afterViewInjected()]
Note: Processing root elements
Note: Processing root elements EActivityHandler: [com.myproject.jointv.activities.VideoPlayerActivity, com.myproject.jointv.activities.MainActivity]
Note: Processing root elements EFragmentHandler: [com.myproject.jointv.fragments.VideoPlayerFragment]
Note: Processing enclosed elements
Note: Number of files generated by AndroidAnnotations: 3
Note: Writting following API classes in project: []
Note: Generating class: com.myproject.jointv.fragments.VideoPlayerFragment_
Note: Generating class: com.myproject.jointv.activities.MainActivity_
Note: Generating class: com.myproject.jointv.activities.VideoPlayerActivity_
Note: Time measurements: [Whole Processing = 387 ms], [Extract Manifest = 131 ms], [Generate Sources = 97 ms], [Process Annotations = 59 ms], [Find R Classes = 43 ms], [Extract Annot
ations = 25 ms], [Validate Annotations = 18 ms],
Note: Finish processing
E:\AndroidProject\JoinTV\app\src\main\java\com\myproject\jointv\component\ApiComponent.java:22: error: com.myproject.jointv.database.DataBaseHelper cannot be provided without an
@Inject constructor or from an @Provides- or @Produces-annotated method.
void inject(ServiceDownloaderPlayList service);
^
com.myproject.jointv.services.ServiceDownloaderPlayList.dataBaseHelper
[injected field of type: com.myproject.jointv.database.DataBaseHelper dataBaseHelper]
E:\AndroidProject\JoinTV\app\src\main\java\com\myproject\jointv\component\DataBaseComponent.java:18: error: com.myproject.jointv.api.WherePlaysAPI cannot be provided without an @
Provides- or @Produces-annotated method.
void inject(ServiceDownloaderPlayList service);
^
com.myproject.jointv.services.ServiceDownloaderPlayList.wherePlaysAPI
[injected field of type: com.myproject.jointv.api.WherePlaysAPI wherePlaysAPI]
Note: Start processing for 0 annotations on 0 elements
Note: Time measurements: [Whole Processing = 1 ms],
Note: Finish processing
5 errors
:app:compileDebugJavaWithJavac FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:compileDebugJavaWithJavac'.
> Compilation failed; see the compiler error output for details.
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED
这是我的 gradle 应用程序。
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.5.0'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
还有我的 gradle 模块
apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "com.myproject.jointv"
minSdkVersion 21
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
apt {
arguments {
androidManifestFile variant.outputs[0].processResources.manifestFile
resourcePackageName android.defaultConfig.applicationId
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.squareup.retrofit:retrofit:1.9.0'
compile 'com.android.support:recyclerview-v7:23.2.0'
compile 'com.android.support:leanback-v17:23.2.0'
compile 'com.android.support:appcompat-v7:23.2.0'
compile 'com.github.bumptech.glide:glide:3.4.+'
compile 'com.squareup.okhttp:okhttp:2.5.0'
compile 'com.squareup.okhttp:okhttp-urlconnection:2.5.0'
compile 'com.android.support:support-v4:23.2.0'
compile 'com.android.support:design:23.2.0'
compile 'com.danikula:videocache:2.3.3'
compile 'org.androidannotations:androidannotations-api:3.3.2'
apt 'org.androidannotations:androidannotations:3.3.2'
compile 'com.google.dagger:dagger:2.0.2'
apt 'com.google.dagger:dagger-compiler:2.0.2'
provided 'org.glassfish:javax.annotation:10.0-b28'
}
我整天都在使用相同的配置,但现在我不知道问题可能出在哪里以及为什么它没有生成组件类。
API 组件。
@Singleton
@Component(modules = {
ApiModule.class,
DataBaseModule.class
})
public interface ApiComponent {
void inject(ServiceDownloaderPlayList service);
}
缓存组件
@Singleton
@Component(modules = {
CacheModule.class
})
public interface CacheComponent {
void inject(VideoPlayerFragment fragment);
}
数据库组件
@Singleton
@Component(modules = {
DataBaseModule.class
})
public interface DataBaseComponent {
void inject(ServiceDownloaderPlayList service);
}
提示
当我评论 DataBaseComponent 或 ApiComponent 时,一切正常。
【问题讨论】:
-
您的模块不提供
WherePlaysAPI和DataBaseHelper类。 -
您想在
ServiceDownloaderPlayList中使用它们,但用于注入它的组件没有您想提供的所有依赖项。 -
这两个问题的出现是因为项目没有加载 DaggerApiComponent,如果我删除了错误将再次引发,但与其他 DaggerComponentName 相同。如果 DaggerComponentName 未加载,则会引发此类错误。我更新了我的问题。
-
除非您的组件能够使用其模块在给定范围内提供所有依赖项,否则您不能对类使用字段注入。
-
@EpicPandaForce 加载组件时问题已解决。我试图先解决这个问题。我将尝试删除或不复制 ServiceDownloaderPlayList 中的不同组件。
标签: android android-gradle-plugin build.gradle dagger-2