在没有Android的情况下使用Dagger2

时间:2017-09-06 12:00:07

标签: java intellij-idea dependency-injection dagger-2

我想在项目Gradle中使用Dagger2和MVP,但在本机Java中没有Android。 但我无法构建我的项目,DaggerAppComponent类从未生成。 该类由Dagger lib在编译时自动生成。

build.gradle:

plugins {
    id "net.ltgt.apt" version "0.11"
}
apply plugin: 'java'
apply plugin: 'idea'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

compileJava {
    options.annotationProcessorPath = configurations.apt
}

configurations {
    apt
}


dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'

    compile "com.google.dagger:dagger:2.11"
    apt     "com.google.dagger:dagger-compiler:2.11"
    apt     "com.google.dagger:dagger-producers:2.11"


    compileOnly "com.google.auto.factory:auto-factory:1.0-beta3"
    apt         "com.google.auto.factory:auto-factory:1.0-beta3"

    compileOnly "org.immutables:value:2.2.10:annotations"
    apt         "org.immutables:value:2.2.10"


    provided 'javax.annotation:jsr250-api:1.0'
    compile 'org.glassfish:javax.annotation:10.0-b28'

}

Main.java

public class Main {

private static AppComponent appComponent;

    public static void main(String[] args) {

        /**
         * Launch the application.
         */
        EventQueue.invokeLater(new Runnable() {
            public void run() {

                appComponent = initDagger();

                try {
                    MainViewImpl mainView = new MainViewImpl();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public AppComponent getAppComponent() {
        return appComponent;
    }

    public static AppComponent initDagger() {
        return DaggerAppComponent.builder().appModule(new AppModule())
                .build();
    }
}

当我构建我的项目时,我有这个错误:

Error:(38, 16) java: cannot find symbol
  symbol:   variable DaggerAppComponent
  location: class main.Main

DaggerAppComponent类永远不会构建。 你有什么想法吗?

3 个答案:

答案 0 :(得分:0)

我会说这段代码

compileJava {
    options.annotationProcessorPath = configurations.apt
}

configurations {
    apt
}

没有必要。

您还必须在IDE选项中激活注释处理。您可以通过运行gradle compile来检查是否属于这种情况,并检查gradle是否生成了源

几年前我遇到过类似的问题,我终于解决了这个问题。您可以找到解决方案here

答案 1 :(得分:0)

您需要遵循Gradle Annotation Processing插件https://github.com/tbroyer/gradle-apt-plugin

的IDE说明

像Dagger2和Lombok这样的注释需要一个注释处理器。这可以通过配置IDE来完成,但最好尽可能地通过gradle处理。

话虽如此,你仍然需要为Eclipse或IntelliJ做些什么。 对于IntelliJ,这是重要的部分:

  

在IntelliJ IDEA中使用Gradle集成时(而不是   ida task),建议将IDE构建操作委托给   Gradle本身从IDEA 2016.3开始:   https://www.jetbrains.com/idea/whatsnew/#v2016-3-gradle否则,   您必须手动启用注释处理:在设置...→   构建,执行,部署→编译器→注释处理器,检查   启用注释处理并从项目中获取处理器   类路径。要模仿Gradle行为和生成的文件行为,   您可以配置生产和测试源目录    build / generated / source / apt / main build / generated / source / apt / test   分别选择存储生成的源相对于:Module   内容根。

在Launcher的Project Defaults中配置它,这样你只需要执行一次。

  

请注意,从IntelliJ IDEA 2016.1开始,除非您委派   为Gradle构建操作,您必须取消选中创建单独的模块   导入项目时每个源设置

答案 2 :(得分:0)

例如,要在Java库中实现Dagger2。我编写了一个简短的演示,您将在其中看到如何做。看看这个:

How to use Dagger in Java library module in Android Studio?