Search code examples
groovydagger-2

How to use Dagger for Groovy?


How to configure dagger to inject groovy classes, and to inject into groovy classes?

I was initially trying to get dagger to inject a groovy class into my java app, and I found dagger was complaining the groovy class is not found. Looking at the log, it seems that compileGroovy happens after compileJava. And the annotation processing of dagger compiler seems to be in compileJava. I guessed that might be the problem -- no groovy classes are available at this time. But I've yet figured out a way to coerce either of dagger or groovy to work with the other.

It seems I could not upload a .tar.gz. But if anyone needs a minimal demo code for what I meant to achieve, these might help (with 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()
  }
}

Solution

  • By default, the groovy compiler will not run the java annotation processors...

    You can add this to your build.gradle:

    compileGroovy {
        groovyOptions.javaAnnotationProcessing = true
    }
    

    You will of course need to add an import

    import org.example.dagger.DaggerMainComponent
    

    To Main.groovy