在 Gradle 的 Java 插件的 compileTestJava 中找不到为 Dagger 2 组件生成的 class
The generated class for Component of Dagger 2 is not found in compileTestJava of Gradle's Java Plugin
好吧,我正在迁移我的 Android 项目以使用 Clean Architecure:
https://github.com/android10/Android-CleanArchitecture
这意味着我的部分代码在域模块中(纯 Java,不依赖于 Android)。对于这个项目,我使用的是 Dagger 2,它使用注释处理器生成源代码(在编译时)。
我的项目有以下 Gradle 配置:
apply plugin: 'java'
sourceCompatibility = 1.7
targetCompatibility = 1.7
configurations {
provided
}
sourceSets {
main {
compileClasspath += configurations.provided
runtimeClasspath += configurations.provided
}
test {
compileClasspath += configurations.provided
runtimeClasspath += configurations.provided
}
}
dependencies {
def domainDependencies = rootProject.ext.domainDependencies
def domainTestDependencies = rootProject.ext.domainTestDependencies
provided domainDependencies.daggerCompiler
provided domainDependencies.javaxAnnotation
compile domainDependencies.dagger
compile domainDependencies.rxJava
compile domainDependencies.joda
testCompile domainTestDependencies.junit
testCompile domainTestDependencies.assertJ
testCompile domainTestDependencies.mockito
testCompile domainTestDependencies.jMockLegacy
testCompile domainTestDependencies.commonsCsv
}
在我的测试源中,我创建了接口 TestComponent 并且 Dagger 应该生成 DaggerTestComponent。当我尝试通过命令行或 Android Studio 构建我的项目时,我收到编译错误 cannot find symbol 然后: Execution failed for task ' :domain:compileTestJava'.
我尝试将 'provided' 更改为 'compile' 和 'testCompile'。还是不行。
奇怪的是,在compileTestJava失败后,我可以在domain/build/classes/test中找到生成的DaggerTestComponent.java。那么,如果它正在生成,为什么我会收到此编译错误?
需要注意的是,这个问题只发生在测试源中。我已经生成了在主源中使用的 Dagger 2 的源代码。
更新:
我评论了每个尝试使用 DaggerTestComponent 的地方并尝试重新构建。在domain/build/classes/test中,现在不仅可以找到DaggerTestComponent.java,还可以找到.class的编译结果。因此,它正在生成源文件并进行编译。为什么使用它编译文件不起作用?这似乎是一些顺序问题,比如在编译其他源时生成的源还没有准备好。
感谢@EpicPandaForce,我开始担心是否也有用于纯 Java 的 APT 插件。经过搜索,我找到了这个:
https://github.com/tbroyer/gradle-apt-plugin
我刚刚应用了该插件并更改了我对 apt 和 testApt 的依赖关系。
好吧,我正在迁移我的 Android 项目以使用 Clean Architecure:
https://github.com/android10/Android-CleanArchitecture
这意味着我的部分代码在域模块中(纯 Java,不依赖于 Android)。对于这个项目,我使用的是 Dagger 2,它使用注释处理器生成源代码(在编译时)。
我的项目有以下 Gradle 配置:
apply plugin: 'java'
sourceCompatibility = 1.7
targetCompatibility = 1.7
configurations {
provided
}
sourceSets {
main {
compileClasspath += configurations.provided
runtimeClasspath += configurations.provided
}
test {
compileClasspath += configurations.provided
runtimeClasspath += configurations.provided
}
}
dependencies {
def domainDependencies = rootProject.ext.domainDependencies
def domainTestDependencies = rootProject.ext.domainTestDependencies
provided domainDependencies.daggerCompiler
provided domainDependencies.javaxAnnotation
compile domainDependencies.dagger
compile domainDependencies.rxJava
compile domainDependencies.joda
testCompile domainTestDependencies.junit
testCompile domainTestDependencies.assertJ
testCompile domainTestDependencies.mockito
testCompile domainTestDependencies.jMockLegacy
testCompile domainTestDependencies.commonsCsv
}
在我的测试源中,我创建了接口 TestComponent 并且 Dagger 应该生成 DaggerTestComponent。当我尝试通过命令行或 Android Studio 构建我的项目时,我收到编译错误 cannot find symbol 然后: Execution failed for task ' :domain:compileTestJava'.
我尝试将 'provided' 更改为 'compile' 和 'testCompile'。还是不行。
奇怪的是,在compileTestJava失败后,我可以在domain/build/classes/test中找到生成的DaggerTestComponent.java。那么,如果它正在生成,为什么我会收到此编译错误?
需要注意的是,这个问题只发生在测试源中。我已经生成了在主源中使用的 Dagger 2 的源代码。
更新:
我评论了每个尝试使用 DaggerTestComponent 的地方并尝试重新构建。在domain/build/classes/test中,现在不仅可以找到DaggerTestComponent.java,还可以找到.class的编译结果。因此,它正在生成源文件并进行编译。为什么使用它编译文件不起作用?这似乎是一些顺序问题,比如在编译其他源时生成的源还没有准备好。
感谢@EpicPandaForce,我开始担心是否也有用于纯 Java 的 APT 插件。经过搜索,我找到了这个:
https://github.com/tbroyer/gradle-apt-plugin
我刚刚应用了该插件并更改了我对 apt 和 testApt 的依赖关系。