Котлин не видит Java Lombok аксессоры?
использование выпуска Kotlin 1.0.0 (компиляция в IntelliJ 15).
println(myPojoInstance.foo)
когда он пытается скомпилировать код (в IntelliJ или Gradle), который ссылается на POJOs на основе Ломбока, он дает ошибку "не может получить доступ к "foo": это "частный" в "MyPojo". Что верно, они все частные, и мой объект имеет @Value @Builder для аннотаций lombok.
Я пробовал специально вызывать getFoo (), но он говорит "неразрешенная ссылка для getFoo". Возможно, есть какой-то трюк, чтобы сделать Kotlin знаете, как обращаться с аннотациями Ломбока?
4 ответов
Как правило, нет, это не так. Причина этого поведения заключается в том, что Lombok является обработчиком аннотаций для javac, но когда компилятор kotlin работает, он также использует javac, но без обработки аннотаций, поэтому kotlin не видит объявлений, которые еще не были сгенерированы.
единственным обходным путем на данный момент является определение строгого порядка компиляции: Java сначала и после этого kotlin. К сожалению, этот подход имеет большой недостаток: вы не можете использовать код Kotlin из Java в этом случае. Чтобы обойти это, вам может понадобиться многомодульный проект, который может вызвать много боли
Как упоминалось в комментариях выше, delombok помогает. В случае Maven build это будет:
<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>
чтобы добавить к ответу Сергея Машкова (добавляя здесь, у меня недостаточно очков репутации, чтобы прокомментировать его), вот приложения настройки мультипроекта Gradle, где Котлин может видеть код, сгенерированный Ломбоком (без kapt или delomboking. Предостережения действительно применяются-а именно, Kotlin может вызвать код Java, но Java не может вызвать код Kotlin в этом конкретном модуле (так как это создаст циклическую зависимость). Такая сборка может быть подходящей, если у вас есть существующая кодовая база Java и весь новый код написан на Котлине.
Я хотел бы видеть полную поддержку Ломбок/Котлин, однако. Хотя Kotlin полностью совместим с Java, реальность такова, что Lombok очень широко используется, и эта проблема может помешать большому количеству разработчиков, которые хотели бы переключиться на Kotlin.
похоже, что это работает, если вы используете delombok в соответствии с сайт и добавьте папку target/generated-sources / delombok в pom.xml в разделе сборка > Плагины > плагин > kotlin-maven-plugin