【问题标题】:Using Dagger2 with Lombok将 Dagger2 与 Lombok 一起使用
【发布时间】:2018-10-25 23:18:36
【问题描述】:

有人用过 Lombok 1.16 和 Dagger2 吗?

我当前的代码如下:

@AllArgsConstructor(onConstructor = @__(@Inject))
public class JuiceMaker {
    private final Apple apple;

错误是:

JuiceMaker cannot be provided without an @Inject constructor or from an @Provides-annotated method.

如果没有 Lombok 注释,这实际上可以工作,所以:

public class JuiceMaker {
    private final Apple apple;
    @Inject
    public JuiceMaker(Apple apple){
        this.apple = apple
    }
}

作品

【问题讨论】:

  • 我相信您的错误来自其他地方。请看How to fix cannot be provided
  • 没有 Lombok 也能正常工作
  • 如果您正在运行 JDK8,请检查此link out
  • @Jessica,你有没有得到这个答案?我有同样的问题。像你一样,当我手动添加构造函数时它可以工作,但当 Lombok 使用 @RequiredArgsConstructor(onConstructor = @__(@Inject)) 生成构造函数时它不起作用

标签: dagger-2 lombok dagger


【解决方案1】:

这是我的答案here的复制粘贴版本:

这不是问题的直接答案,似乎已经解决了,但可以作为未来搜索者的参考:

如果您使用 Dagger(或其他东西)来处理您的注释,例如

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.7.0</version>
      <configuration>
        <annotationProcessorPaths>
          <path>
            <groupId>com.google.dagger</groupId>
            <artifactId>dagger-compiler</artifactId>
            <version>2.15</version>
          </path>
        </annotationProcessorPaths>
        <source>1.8</source>
        <target>1.8</target>
      </configuration>
    </plugin>
    ....
  </plugins>
</build>

你必须在这里添加 lombok 作为路径

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.7.0</version>
      <configuration>
        <annotationProcessorPaths>
          <path>
            <groupId>com.google.dagger</groupId>
            <artifactId>dagger-compiler</artifactId>
            <version>2.15</version>
          </path>

          <!-- SOLUTION --> 
          <path>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.20</version>
          </path>


        </annotationProcessorPaths>
        <source>1.8</source>
        <target>1.8</target>
      </configuration>
    </plugin>
    ....
  </plugins>
</build>

但您仍然必须将 lombok 列为提供的依赖项;)

【讨论】:

  • 非常感谢!这就是原因!
  • 这似乎对我不起作用。如果我从组件接口中删除该类,lombok 代码确实会正确生成要与 @Inject 注释绑定的类,但是当我实际尝试使用它时,会出现 Dagger/MissingBinding 错误。对我来说,如果我使用我的 IDE delombok @RequiredArgsConstructor(onConstructor_ = @Inject) 然后构建它,它也可以正常工作。
  • 这解决了 80% 的问题。谢谢。但是,和其他人一样,我仍然无法让@RequiredArgsConstructor(onConstructor = @__(@Inject)) 工作。
【解决方案2】:

问题在于,当 dagger 注释处理器查找 @Inject 构造函数时,它们还没有由 lombok 生成。一种解决方案可能是对源代码进行 delombok,然后对其进行编译。但我个人没有这样做。

【讨论】:

    【解决方案3】:

    我正在尝试解决它,但不幸的是,我仍然没有设法解决它。

    到目前为止,我所取得的进展如下(在 Gradle 中):使用 Ant 任务作为函数并将源代码生成到某个构建文件夹中,之后匕首处理器可能会在其中找到。但我承认这种方式可能会很尴尬。

    以下代码 sn-p 尝试以与项目无关的方法使用当前在 lombok.jar 中的 ant 任务。

    final def generateJava = { ->
      ant.taskdef(
        name: 'delombok',
        classname: 'lombok.delombok.ant.Tasks$Delombok',
        classpath: configurations.annotationProcessor
          .filter { (it.name =~ 'lombok') }.asPath
      )
      ant.mkdir(dir: sourceSets.main.output.classesDirs.asPath)
      ant.delombok(
        verbose: true,
        encoding: StandardCharsets.UTF_8,
        from: sourceSets.main.java.sourceDirectories.asPath,
        to: sourceSets.main.output.classesDirs.asPath,
        modulepath: sourceSets.main.runtimeClasspath.asPath
      )
    }
    

    最后尝试将生成的代码附加到 Dagger 可以扫描的其他位置。

    sourceSets.main.java.srcDirs = sourceSets.main.output.classesDirs
    

    我目前使用的是 Gradle 版本 6.0.1 和 lombok 1.18.10。我不确定它是否向后兼容。

    【讨论】:

      猜你喜欢
      • 2020-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-21
      • 2019-05-20
      • 2018-02-17
      • 1970-01-01
      相关资源
      最近更新 更多