Подтвердить что ты не робот

Котлин не видит аксессуаров Java Lombok?

Использование выпуска Kotlin 1.0.0 (компиляция в IntelliJ 15).

println(myPojoInstance.foo)

Когда он пытается скомпилировать код (в IntelliJ или Gradle), который ссылается на POJO на основе Lombok, он дает ошибку "Не удается получить доступ к foo": это "w710" в "MyPojo". Это правда, они все частные, а мой объект имеет @Value @Builder для аннотаций lombok.

Я пробовал специально вызвать getFoo(), но он говорит "неразрешенная ссылка для getFoo". Может быть, какой-то трюк, чтобы Котлин знал, как обращаться с аннотациями ломбока?

4b9b3361

Ответ 1

Как правило, нет, это не так. Причина этого поведения заключается в том, что Lombok является обработчиком аннотации для javac, но когда компилятор kotlin работает, он использует javac, но без обработки аннотаций, поэтому поэтому kotlin не видит деклараций, которые еще не были созданы.

Единственным обходным решением на данный момент является определение строгой последовательности компиляции: сначала Java, а после этого котлин. К сожалению, этот подход имеет большой недостаток: вы не можете использовать код Kotlin из Java в этом случае. Чтобы обойти это, вам может потребоваться многомодульный проект, который может вызвать много боли.

Ответ 2

Как уже упоминалось в комментариях выше, delombok помогает. В случае сборки maven это будет:

<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>