Hello,
I'm wanting to use Kotlin in a project that uses Lombok with Java.
However, while the IDE shows code as valid, the Kotlin compiler can not see Lombok generated code.
This makes mixing Java+Lombok with Kotlin impossible.
Would it be possible to also apply the Lombok processing to the Kotlin compiler so we can have harmony?
For my Android App I'm currently playing with Kotlin and was able to let Kotlin see Lombok generated getters by adding the lombok processor to kapt.
provided "org.projectlombok:lombok:1.16.14"
annotationProcessor "org.projectlombok:lombok:1.16.14"
kapt "org.projectlombok:lombok:1.16.14"
This is from a gradle build but should be also possible with maven. :)
How can this be done via Maven? Also how can I use kapt in IDE?
I tried using kapt with lombok annotation processor as follows:
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>${kotlin.version}</version>
<executions>
<execution>
<id>kapt</id>
<goals>
<goal>kapt</goal>
</goals>
<configuration>
<sourceDirs>
<sourceDir>${project.basedir}/src/main/java</sourceDir>
</sourceDirs>
<annotationProcessors>
<annotationProcessor>lombok.core.AnnotationProcessor</annotationProcessor>
</annotationProcessors>
</configuration>
</execution>
...
With no effect.
I have the same problem. We are using Lombok in our Android apps and it looks like we can't use it along side with kotlin. @dodgex suggestion did not work for me.
@dodgex I added kapt plugin with kapt "org.projectlombok:lombok:1.16.14" .
But impossible access to getter ( generated by lombok )
Help me!
Any solution found to this? I have the same issue. We use Intellij with Java and lombok. and build with maven.
Hi,
The only solution I found quite satisfactory was to move the lombok annotated java file in a separate maven module. But in our case lombok annotations were only used for DTOs (model), so it did make sense to approach this way.
Kind regards
Tony
For anyone looking for a solution, I've created a demo app illustrating the separate module idea mentioned by @jtonic (except using Gradle rather than Maven).
@dodgex do you have a working solution or a minimal proof-of-concept that you are able to post? All of the comments here suggest that this does not work.
Sorry but currently I don't have a project using lombok & kotlin.
Hmmm. I'm probably not understanding the issue but it seems like this is possible as of Kotlin 1.2.21. All I did was blindly follow the instructions on the Kotlin Web site ...
https://kotlinlang.org/docs/reference/using-maven.html#compiling-kotlin-and-java-sources
https://kotlinlang.org/docs/reference/using-gradle.html
and I was able to see Lombok-generated methods in Kotlin without creating any separate modules ...
https://github.com/mouyang/kotlin-lombok/tree/master/gradle
https://github.com/mouyang/kotlin-lombok/tree/master/maven
Again, I'm probably misunderstanding the issue completely so any clarification would be appreciated.
Hi,
I am not a specialist but I am trying to shed a light on the problem.
There are some popular ATP libraries to generate useful java sources (related to hibernate, spring boot properties, java bean mappers - MapStruct) and there is no problem with them in java/kotlin module, thanks to kapt. But on the other hand because lombok modifies the bytecode during the compilation kapt can do nothing about it.
This is the problem I came across and if, I remember well, there was a thread, I suppose on stackoverflow, where the kotlin language architect told about this issue, explaining things more in depth.
Kind regards.
@jtonic, thank you. Your explanation makes a lot of sense.
@dodgex If you have time, can you take a look at a sample branch I have? It's an minimal unsuccessful attempt to use Lombok in Kotlin, and I was wondering what you did to make it work.
I did not use "annotationProcessor" since I'm not working on Android, but I don't know if that actually matters or not. https://github.com/mouyang/kotlin-lombok/tree/broken-gradle-kapt
@mouyang
I looked a bit over your example (gradle based one) and I have some recommendations.
Note: I remember I read on some stack overflow thread another approach - smth like put some generated lomboked classes in a gen folder and then refer it in the kotlin compilation one. This could work but for me it was an additional burden on the build tool.
I really hope all these help you figured out how to approach the kotlin/java/lombok issue.
I've been trying to look for a solution for this problem to try to get my ancient team to migrate to a new language. we're so ancient that the leads complain about using java8's lambdas. i ended up making a pom.xml that delomboks the code in src/main/java then compiles the delomboked code with the kotlin plugin:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ericytsang</groupId>
<artifactId>playground</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>com.ericytsang playground</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<kotlin.version>1.2.50</kotlin.version>
<junit.version>4.12</junit.version>
<lombok.version>1.16.8</lombok.version>
</properties>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>${kotlin.version}</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-test-junit</artifactId>
<version>${kotlin.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-maven-plugin</artifactId>
<version>${lombok.version}.0</version>
<executions>
<execution>
<id>delombok</id>
<phase>generate-sources</phase>
<goals>
<goal>delombok</goal>
</goals>
<configuration>
<sourceDirectory>src/main/java</sourceDirectory>
<outputDirectory>${project.build.directory}/delombok-main</outputDirectory>
<addOutputDirectory>false</addOutputDirectory>
</configuration>
</execution>
<execution>
<id>delombok-test</id>
<phase>generate-test-sources</phase>
<goals>
<goal>delombok</goal>
</goals>
<configuration>
<sourceDirectory>src/test/java</sourceDirectory>
<outputDirectory>${project.build.directory}/delombok-test</outputDirectory>
<addOutputDirectory>false</addOutputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>${kotlin.version}</version>
<executions>
<execution>
<id>compile</id>
<phase>process-sources</phase>
<goals>
<goal>compile</goal>
</goals>
<configuration>
<sourceDirs>${project.build.directory}/delombok-main</sourceDirs>
</configuration>
</execution>
<execution>
<id>test-compile</id>
<phase>test-compile</phase>
<goals>
<goal>test-compile</goal>
</goals>
<configuration>
<sourceDirs>${project.build.directory}/delombok-test</sourceDirs>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
i usually use gradle..im not too familiar with maven. improvements are welcome. i don't think it supports incremental compilation...i also imagine that having to modify every plugin originally using src/main/java to now use ${project.build.directory}/delombok-main would be a pain. debugging also becomes odd since the compiled code is the delomboked code instead of the code in src/main/java.
Seems like Kotlin themselves is working on a Lombok integration: https://github.com/JetBrains/kotlin/tree/master/plugins/lombok/lombok-compiler-plugin
That's fascinating, I had a quick look at the code and it seems like it adds some kind of method stubs to make them visible for Kotlin. If I have not missed anything that requires a basic reimplementation of all lombok handlers, seems to be a bunch of work :smile:
I also tried to understand the Kotlin compilation process and I think it still invokes javac to compile the Java files. If it would be possible to run an annotation processor at that moment lombok should work. IIRC I did something similar some time ago for an android project: https://github.com/projectlombok/lombok/issues/2412#issuecomment-662685863
Most helpful comment
Hi,
I am not a specialist but I am trying to shed a light on the problem.
There are some popular ATP libraries to generate useful java sources (related to hibernate, spring boot properties, java bean mappers - MapStruct) and there is no problem with them in java/kotlin module, thanks to kapt. But on the other hand because lombok modifies the bytecode during the compilation kapt can do nothing about it.
This is the problem I came across and if, I remember well, there was a thread, I suppose on stackoverflow, where the kotlin language architect told about this issue, explaining things more in depth.
Kind regards.