kotlin lombok println

¿Kotlin no ve los accesores Java Lombok?



println (4)

Como se mencionó en los comentarios anteriores, delombok ayuda. En caso de construcción maven sería:

<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> <formatPreferences> <javaLangAsFQN>skip</javaLangAsFQN> </formatPreferences> <verbose>true</verbose> </configuration> </execution> <execution> <id>test-delombok</id> <phase>generate-test-sources</phase> <goals> <goal>testDelombok</goal> </goals> <configuration> <verbose>true</verbose> </configuration> </execution> </executions> </plugin>

Usando la versión Kotlin 1.0.0 (compilando en IntelliJ 15).

println(myPojoInstance.foo)

Cuando intenta compilar código (en IntelliJ o Gradle) que hace referencia a POJO basados ​​en Lombok, aparece el error "No se puede acceder a ''foo'': es ''privado'' en" MyPojo ". Lo cual es cierto, todos son privados y mi objeto tiene @Value @Builder para anotaciones de lombok.

He intentado llamar específicamente a getFoo (), pero dice "referencia no resuelta para getFoo". ¿Quizás haya algún truco para que Kotlin sea consciente de cómo manejar las anotaciones de lombok?


En general, no, no lo hace. La razón de ese comportamiento es que Lombok es un procesador de anotaciones para javac, pero cuando se ejecuta el compilador de kotlin, también usa javac, pero sin procesamiento de anotaciones, por eso kotlin no ve las declaraciones que aún no se generaron.

La única solución por ahora es definir un estricto orden de compilación: Java primero y luego kotlin. Desafortunadamente, este enfoque tiene una gran desventaja: en este caso no puede usar el código Kotlin de Java. Para solucionarlo, es posible que necesite un proyecto multimódulo que pueda causar mucho dolor


Para agregar a la respuesta de Sergey Mashkov (agregando aquí, no tengo suficientes puntos de representante para comentarlo), aquí hay una aplicación de ejemplo de una configuración de múltiples proyectos de Gradle donde Kotlin puede ver el código generado por Lombok (sin kapt ni desarmado). sí, es decir, Kotlin puede llamar al código Java, pero Java no puede llamar al código Kotlin en ese módulo en particular (ya que esto crearía una dependencia circular). Este tipo de compilación podría ser adecuado si tiene una base de código Java existente y Sin embargo, todo el código nuevo está escrito en Kotlin.

Sin embargo, me encantaría ver el soporte completo de Lombok / Kotlin. Si bien Kotlin es totalmente interoperable con Java, la realidad es que Lombok se usa ampliamente, y este problema puede evitar que una gran cantidad de desarrolladores que deseen cambiar a Kotlin lo hagan.


Parece que funciona si usa delombok de acuerdo con el site y agrega la carpeta target / generate-sources / delombok en pom.xml en build> plugins> plugin> kotlin-maven-plugin