2016-02-20 14 views
34

Używanie wersji Kotlin 1.0.0 (kompilacja w IntelliJ 15).Kotlin nie widzi akcesorów Java Lombok?

println(myPojoInstance.foo) 

Kiedy próbuje skompilować kod (w IntelliJ lub Gradle), która odwołuje POJOs Lombok oparte daje błąd „Nie można uzyskać dostępu«foo»: jest«prywatny»w« MyPojo», co jest prawdą, że "Wszystkie są prywatne i mój obiekt ma @Value @Builder dla adnotacji lombok."

Próbowałem specjalnie wywoływać getFoo(), ale mówi "nierozwiązane referencje dla getFoo". Może jest jakaś sztuczka, aby uczynić Kotlin świadomym tego, jak do obsługi Lombok adnotacje?

+1

użyłeś 'kapt'? http://blog.jetbrains.com/kotlin/2015/06/better-annotation-processing-supporting-stubs-in-kapt/ – voddan

+0

Jak zaznacza @voddan, nie podajesz wystarczających informacji o tym, czego próbowałeś użyć rozwiązać ten problem. Również jeśli wypróbowałeś Kapt, jest on w obrębie jednego modułu lub wielu modułów. –

+1

Nie wiedziałem, dopóki nie wspomniano o "kapu", że jest coś, co można by spróbować rozwiązać. Czytałem stronę JetBrains "java-interop" wielokrotnie i nie mogłem znaleźć niczego, co by wskazywało, jak sobie z tym poradzić. IntelliJ nie sygnalizuje tego jako błędu w edytorze, ale kompilacja zarówno w IntelliJ, jak iw Gradle (za pośrednictwem JetBrains kotlin gradle plugin) nie działała. –

Odpowiedz

24

ogólnie, nie, to nie. powodem tego jest to, że zachowanie Lombok jest procesor adnotacji do javac ale gdy T kompilator kotlin działa również javac, ale bez przetwarzania adnotacji, dlatego właśnie kotlin nie widzi deklaracji, które nie zostały jeszcze wygenerowane.

Jedynym sposobem obejścia tego problemu jest określenie ścisłej kolejności kompilacji: najpierw Java, a potem kotlin. Niestety takie podejście ma wielką wadę: w tym przypadku nie można używać kodu Kotlin z Javy. Aby obejść to może trzeba wielomodułowej projekt, który może spowodować wiele bólu

+2

No cóż. Tak, wziąłem fragment Java w trakcie mojego programu i zmigrowałem go do Kotlin, aby zobaczyć, jak będzie działać obsługa Java-> Kotlin-> Java. Celem jest migracja kodu w czasie. Jednak używamy Lombok mocno we wszystkich naszych POJO domen. Może uda mi się zhakować obiekt docelowy "compilePOJOs", aby działał przed kompilacjąJava. –

+2

Sergey, czy istnieje link JetBrains/FAQ na temat tego, jak Kotlin patrzy na kod Java znajdujący się w pobliżu kodu (ten sam moduł)? Gradle kompilujeKomplin przed kompilacjąJava, ale oczywiście Kotlin zna kod Java (oprócz preprocessingu adnotacji). Czy kompilator Kotlin skanuje kod Java przed kompilowaniem plików .kt? –

+2

Nie jesteś sam, mamy generowane przez Spring Roo POJO i Kotlin nie widzi ich również z tego samego powodu, co powiedział Siergiej. – user2138356

1

Jak wspomniano powyżej w komentarzach, delombok pomaga. W przypadku maven kompilacji byłoby:

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

Aby dodać do odpowiedzi Siergieja Mashkov za (dodawanie tutaj nie mam wystarczająco dużo punktów rep aby wypowiedzieć się na to), oto example app z Gradle konfiguracji multi-projektowej gdzie Kotlin może zobaczyć wygenerowany przez Lombok kod (bez kaptura lub delombokingu) Zastrzeżenia mają zastosowanie - a mianowicie, Kotlin może wywoływać kod Java, ale Java nie może wywołać kodu Kotlin w tym konkretnym module (ponieważ spowodowałoby to zależność cykliczną) Ten rodzaj kompilacji może być odpowiedni, jeśli masz istniejącą bazę kodu Java i cały nowy kod jest zapisany w Kotlin, jednak

Chciałbym jednak zobaczyć pełne wsparcie dla Lombok/Kotlin, podczas gdy Kotlin jest w pełni interoperacyjny z Javą, w rzeczywistości Lombok jest bardzo szeroko wykorzystywany, a ten problem może uniemożliwić wielu programistom, którzy chcieliby przejść na Kotlin.