13

I use GitHub's Immutables library for Android development, and now I want to give it a try on the backend side as well.

In Android, all I need to to in order to use the library is this:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])

    // immutable entities generation
    provided "org.immutables:value:2.5.5" // for annotations
    provided "org.immutables:builder:2.5.5" // for annotations
    provided "org.immutables:gson:2.5.5" // for annotations

    ... other dependencies
}

When I attempt to copy the above dependencies into build.gradle of my Java project, I get this error:

Error:(24, 0) Gradle DSL method not found: 'provided()'

I tried to replace provided with compileOnly and compile, but then the implementations of the interfaces annotated with @Value.Immutable are not generated.

How do I make it work?

Vasiliy
  • 16,221
  • 11
  • 71
  • 127

2 Answers2

15

I can't add comment (too low rep), but for future readers I want to extend Vasiliy answer.

In my case (gradle wrapper in version 5.2.1) following code auto-magically discovers generated sources:

dependencies {
    def immutablesVersion = "2.8.2"
    annotationProcessor "org.immutables:value:$immutablesVersion" // <--- this is important
    compileOnly "org.immutables:value:$immutablesVersion"
}

I don't need to change anything in IDE annotation processor options, it just works out of the box.

Benjamin Basmaci
  • 2,247
  • 2
  • 25
  • 46
nouveu
  • 162
  • 4
  • 9
  • 3
    As this is an extension to an existing answer that gives additional information to answer the question, its perfectly legitimate to post it as an answer. Even if you had the comment privilege, an answer would still be justified. Just as a general tip, if you directly reference another answer, you can link to it as I did by editing your post. I know this might not seem important if there is only one other answer, but more can follow in the future so its nice to have :) – Benjamin Basmaci Jan 26 '20 at 11:45
14

Found the answer. Sharing in case it will be helpful to anyone (or myself in the future).

First of all, I had to enable annotation processing in IntelliJ as described here (though the option is now located in Settings > Build, Execution, Deployment > Compiler > Annotation Processors).

After that the following code started actually generating the implementation:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])

    // immutable entities generation
    compile "org.immutables:value:2.5.5" // for annotations
    compile "org.immutables:builder:2.5.5" // for annotations
    compile "org.immutables:gson:2.5.5" // for annotations

    ... other dependencies
}

However, I still couldn't automatically import the implementation into source files.

In order to do allow the discovery of the generated classes, I had to right-click on the generated folder in the main package and then Mark Directory As > Generated Sources Root.

Vasiliy
  • 16,221
  • 11
  • 71
  • 127