I tried to use Micronaut with Lombok and there seems to be some kind of conflict between the annotation processing and compile-time tasks that Micronaut executes to process DI and the class metadata, and the annotation processing that Lombok does.
@Data or other annotation from LombokAn important point to highlight is that if I don't use annotations on the Controller, the build is successful (as it doesn't generate all the metadata classes).
Compile successful
Compile error: symbol not found
build.gradle
plugins {
id 'io.franzbecker.gradle-lombok' version '1.14'
id 'java'
}
GreetingDto.java
@Data
public class GreetingDto {
private String greeting;
}
GreetingController.java
@Controller("/hello-world")
public class GreetingController {
@Get
public GreetingDto login(){
GreetingDto dto = new GreetingDto();
dto.setGreeting("Hello world!");
return dto;
}
}
Console output
> Task :compileJava FAILED
Note: Creating bean classes for 1 type elements
/Users/sebastian/development/hello-world/src/main/java/controller/GreetingController.java:17: error: cannot find symbol
dto.setGreeting("Hello world!");
^
symbol: method setGreeting(String)
location: variable dto of type GreetingDto
1 error
I don't know what is different regarding what gradle-lombok does but removing gradle-lombok and adding the following dependencies allows me to compile:
compileOnly 'org.projectlombok:lombok:1.16.20'
annotationProcessor "org.projectlombok:lombok:1.16.20"
Does this work for you?
Hi Graeme, I still get the same error, in fact what the plugin does is adding the dependencies as compileOnly and annotationProcessor (among other things).
Here I created a sample project where it fails: https://github.com/sescotti/mn-hello-world-lombok. On master it has only the dependencies declared, and on using-plugin branch I replaced it with the plugin. Hope this helps!
Seems if you define:
compileOnly 'org.projectlombok:lombok:1.16.20'
annotationProcessor "org.projectlombok:lombok:1.16.20"
Before
annotationProcessor "io.micronaut:inject-java"
Your example compiles. This does however seem fragile to me.
Yes, it works now! I tried a few combinations around the order of the dependencies but obviously didn't try this one, thanks for that. Agree, it's a good workaround by now but fragile indeed.
In maven, I had to add lombok processor to pom file explicitly and before micronaut processor
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.0</version>
</path>
<path>
<groupId>io.micronaut</groupId>
<artifactId>inject-java</artifactId>
<version>${micronaut.version}</version>
</path>
</annotationProcessorPaths>
I ran into these issues trying to debug using IntelliJ IDEA. I had to add lombok as a "compile" dependency for it to work. not sure exactly why it wouldn't run with lombok as "compileonly" but it didnt.
otherwise my solution is the same as above
thought I'd share in case anyone else runs into the same issue
Same problem occur when you use lombok as gradle plugin:
plugins {
id "com.diffplug.eclipse.apt" version "3.22.0"
id "com.github.johnrengelman.shadow" version "6.0.0"
id "application"
id "io.freefair.lombok" version "5.1.1"
}
but resolve when you remove "io.freefair.lombok" as plugin and add in dependency as suggested above by @graemerocher .
Thanks Manav
Most helpful comment
In maven, I had to add lombok processor to pom file explicitly and before micronaut processor