Dagger 2组件未生成Dagger前缀类以构建。

5
我是Dagger 2的新手,在IntelliJ中尝试了Dagger 2 Coffee示例,但似乎它没有生成DaggerCoffeeApp_Coffee(它应该会生成),即使我紧密地遵循了Github上Dagger 2的代码示例。
Public class CoffeeApp {
    @Singleton
    @Component(modules = {DripCoffeeModule.class})
    public interface Coffee {

        CoffeeMaker maker();
    }
    public static void main(String args[]){


        Coffee coffee = DaggerCoffeeApp_Coffee.builder().build();
    }
}

这是我的pom.xml文件。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.tim.test</groupId>
    <artifactId>Dagger2Experiment</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <slf4j-api.version>1.7.12</slf4j-api.version>
    </properties>
    <repositories>
        <repository>
            <id>sonatype</id>
            <name>sonatype-repo</name>
            <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
        </repository>
    </repositories>
    <dependencies>

        <dependency>
            <groupId>com.google.dagger</groupId>
            <artifactId>dagger</artifactId>
            <version>2.0.1</version>

        </dependency>
        <dependency>
            <groupId>com.google.dagger</groupId>
            <artifactId>dagger-compiler</artifactId>
            <version>2.0.1</version>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j-api.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j-api.version}</version>
            <scope>runtime</scope>
        </dependency>
    </dependencies>

</project>

我尝试了下面主题中的各种解决方案,但似乎都没有效果:
我还将jar文件添加到我的应用程序构建路径中,在应用程序的运行时使用dagger-2.0.1.jar,在编译时使用dagger-compiler-2.0.1.jar。
更新 上面的代码片段中我使用了DaggerCoffeeApp_Coffee.builder().build(),因为在找不到构造函数后,我编辑了自己的代码以遵循Dagger 2的github示例。链接如下:

https://github.com/google/dagger/blob/master/examples/simple/src/main/java/coffee/CoffeeApp.java

非常感谢任何帮助。


1
main() 函数中的括号不平衡? - Alvaro Gutierrez Perez
糟糕,谢谢指出。由于是复制粘贴错误,我会进行编辑。我的代码中括号是正确的 :) - t22000
尝试不将 dagger-compiler 声明为可选项。我在Android中使用Gradle的 provided 时遇到了使用 dagger-compiler 的问题,将其设置为 compile 后问题解决了。 - Alvaro Gutierrez Perez
尝试过了,但是目前还没有任何变化,仍然找不到一个以Dagger为前缀的构造函数。我需要一些与Android相关的依赖吗?这是我pom.xml和Google的github上的pom.xml之间唯一的区别。 - t22000
Dagger 不应需要 Android 才能工作,但您可以尝试使用它们的示例查看它是否在您的计算机上运行,以排除设置上的问题。 - Alvaro Gutierrez Perez
2个回答

1

我曾经遇到过类似的问题,后来发现我没有导入由 @Component 接口生成的实现。一旦我添加了这个导入,并使用与我的接口相同的包路径,我的代码就编译并工作了。


1

更新 是的,你抓住了我草率地浏览问题。我没有读到你的代码示例,否则我就会发现pom.xml不是唯一的问题。

  1. I'm assuming your DripCoffeeModule is annotated correctly and has no parameters in its constructor so that you don't need to specify this in building the Component. E.g. :

    @Module
    
    public DripCoffeeModule {
    
    //Uses default constructor
    
    }
    
  2. I've not seen the Component implemented as an inner class before but I'm betting that Dagger won't treat this any different in terms of instantiating. (I would recommend moving it out of CoffeeApp class.) The naming, however, would be incorrect. Instead of

    DaggerCoffeeApp_Coffee.builder().build();
    
你需要遵循Dagger定义的命名约定。来自Dagger网站上标题为“构建图形”的部分:
“实现与接口名称相同,前缀为Dagger。”
因此,您需要修改该行为:
DaggerCoffee.builder().build();

或者您可以使用便捷方法:
DaggerCoffee.create();

如果我在第一点上错了,那么你也需要按照以下方式构建你的模块:
DaggerCoffee.builder().dripCoffeeModule(new DripCoffeeModule()).build();

将编译器从依赖项部分移至编译器部分。来自Dagger 2官方网站。
在Maven项目中,应将运行时内容包含在pom.xml文件的依赖项部分,并将dagger-compiler工件作为编译器插件的依赖项。
例如:
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <dependencies>
                <dependency>
                    <groupId>com.google.dagger</groupId>
                    <artifactId>dagger-compiler</artifactId>
                    <version>2.0</version>
                    <optional>true</optional>
                </dependency>
            </dependencies>
        </plugin>

感谢您抽出时间回顾这个问题。我尝试了您建议的方法,但没有DaggerCoffee构造函数。有趣的是,我查看了Dagger 2的github代码,并做出了相应的更改。您可以在下面看到DaggerCoffeeApp_Coffee.builder().build()的示例代码:https://github.com/google/dagger/blob/master/examples/simple/src/main/java/coffee/CoffeeApp.java - t22000
我会更新我的帖子,以提供更多相关背景信息。 :) - t22000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接