web-dev-qa-db-fra.com

Kotlin ne voit pas Java accesseurs Lombok?

Utilisation de la version Kotlin 1.0.0 (compilation dans IntelliJ 15).

println(myPojoInstance.foo)

Lorsqu'il essaie de compiler du code (dans IntelliJ ou Gradle) qui fait référence aux POJO basés sur Lombok, il donne l'erreur "Impossible d'accéder à 'foo': il est 'privé' dans" MyPojo ". Ce qui est vrai, ils sont tous privés et mon objet a @Value @Builder pour les annotations lombok.

J'ai essayé d'appeler spécifiquement getFoo (), mais il dit "référence non résolue pour getFoo". Il y a peut-être une astuce pour que Kotlin sache comment gérer les annotations lombok?

55
Chris Kessel

En général, non, ce n'est pas le cas. La raison de ce comportement est que Lombok est un processeur d'annotation pour javac mais lorsque le compilateur kotlin s'exécute, il utilise également javac mais sans traitement d'annotation, c'est pourquoi kotlin ne voit pas les déclarations qui n'ont pas encore été générées.

La seule solution de contournement pour l'instant est de définir un ordre de compilation strict: Java d'abord et après ce kotlin. Malheureusement, cette approche a un gros inconvénient: vous ne pouvez pas utiliser le code Kotlin de Java dans ce cas. Pour contourner ce problème, vous pouvez avoir besoin d'un projet multimodule qui peut causer beaucoup de douleur.

46
Sergey Mashkov

Pour ajouter à la réponse de Sergey Mashkov (en ajoutant ici, je n'ai pas assez de points de représentant pour commenter), voici un exemple d'application d'une configuration multi-projets Gradle où Kotlin peut voir le code généré par Lombok (sans kapt ni delomboking. Des mises en garde s'appliquent - à savoir, Kotlin peut appeler le code Java, mais Java ne peut pas appeler le code Kotlin dans ce module particulier) (car cela créerait une dépendance circulaire.) Ce type de construction pourrait convenir si vous avez une base de code Java Java et que tout le nouveau code est écrit en Kotlin, cependant.

J'adorerais cependant voir le support complet de Lombok/Kotlin. Bien que Kotlin soit entièrement interopérable avec Java, la réalité est que Lombok est très largement utilisé, et ce problème peut empêcher un grand nombre de développeurs qui souhaitent passer à Kotlin de le faire.

3
NKR

Comme cela a été mentionné dans les commentaires ci-dessus, delombok aide. En cas de construction de maven, ce serait:

<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>
2
Pavel S.

Il semble que cela fonctionne si vous utilisez delombok conformément à site et ajoutez le dossier target/generated-sources/delombok dans le pom.xml sous build> plugins> plugin> kotlin-maven-plugin

0
abgalphabet YEUNG