【问题标题】:How to use Dagger for Groovy?如何在 Groovy 中使用 Dagger?
【发布时间】:2021-07-13 14:28:50
【问题描述】:

如何配置dagger注入groovy类,注入groovy类?

我最初试图让 dagger 将 groovy 类注入到我的 java 应用程序中,但我发现 dagger 抱怨找不到 groovy 类。查看日志,似乎compileGroovy 发生在compileJava 之后。而且dagger编译器的注解处理好像在compileJava。我猜这可能是问题所在——目前没有可用的 groovy 类。但我还没有想出一种方法来强制 dagger 或 groovy 与另一个一起工作。

我似乎无法上传 .tar.gz。但是,如果有人需要一个最小的演示代码来实现我想要实现的目标,这些可能会有所帮助(使用 gradle 7):

build.gradle:

plugins {
  id 'groovy'
  id 'java'
}

group 'org.example'
version '1.0-SNAPSHOT'

repositories {
  mavenCentral()
}

dependencies {
  annotationProcessor 'com.google.dagger:dagger-compiler:2.+'
  implementation 'com.google.dagger:dagger:2.+'
  implementation 'org.codehaus.groovy:groovy-all:3.+'
}

settings.gradle:

rootProject.name = 'groovy-dagger1'

src/main/groovy/org/example/dagger/MainComponent.groovy:

package org.example.dagger

import dagger.Component

@Component(modules = [
    MainModule,
])
interface MainComponent {
  String message();
}

src/main/groovy/org/example/dagger/MainModule.groovy:

package org.example.dagger

import dagger.Module
import dagger.Provides

@Module
final class MainModule {
  @Provides
  static String message() {
    return 'Hello Groovy Dagger!'
  }
}

src/main/groovy/org/example/main/Main.groovy:

package org.example.main;

class Main {
  static void main(String[] args) {
// Dagger component does not exist :/
// println DaggerMainComponent.create().message()
  }
}

【问题讨论】:

  • 显示你得到的堆栈跟踪

标签: groovy dagger-2


【解决方案1】:

默认情况下,groovy 编译器不会运行 java 注解处理器...

您可以将其添加到您的 build.gradle:

compileGroovy {
    groovyOptions.javaAnnotationProcessing = true
}

您当然需要添加导入

import org.example.dagger.DaggerMainComponent

Main.groovy

【讨论】:

  • 感谢@tim_yates 的回答。但是,第 1 点对我不起作用。如果我需要额外的设置来明确启用“联合编译”,请帮助提供详细信息。尽管如此,第 2 点给了我一些线索和进步。该选项确实允许纯 groovy 项目使用 dagger 正确编译和运行!然而,对于混合的 java 和 groovy 代码似乎要编译和运行,所有源代码,包括 java 和 groovy,都必须在 main/groovy 文件夹中。到目前为止,我仅在 gradle 7 上进行了测试。不确定其他版本的行为是否会有所不同。
  • (这应该是另一个问题,但只是 FTR)IntelliJ(我使用的)似乎无法自动拾取注释处理器生成的代码,当代码在 main/groovy 下时,即使 gradle 可以正确编译和运行它。可以应用手动设置,但在重新加载项目时会被清除。
  • Gradle's groovy plugin guide 提到不会编译main/java 中的常规代码。只有main/groovy 中的 java 代码是。
  • "main/java 不会被编译。只有 main/groovy 中的 java 代码会被编译。" 啊,对不起,你是对的 :-(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-11
  • 1970-01-01
相关资源
最近更新 更多