2016-02-20 21 views
34

使用Kotlin 1.0.0版本(在IntelliJ 15中編譯)。Kotlin沒有看到Java Lombok訪問器?

println(myPojoInstance.foo) 

當它試圖編譯代碼(的IntelliJ或搖籃)引用基於龍目島的POJO它給出了錯誤「無法訪問‘富’:它是‘私人’‘MyPojo’這是真的,他們'所有私人和我的對象有@Value @Builder的lombok註釋

我試過專門調用getFoo(),但它說「未解決的參考getFoo」。也許有一些技巧,使Kotlin意識到如何處理lombok註釋?

+1

你使用過'kapt'嗎? http://blog.jetbrains.com/kotlin/2015/06/better-annotation-processing-supporting-stubs-in-kapt/ – voddan

+0

正如@voddan指出的那樣,您沒有提供關於您嘗試使用的內容的足夠信息解決這個問題。此外,如果您嘗試Kapt,它是在一個模塊還是多個模塊中。 –

+1

直到「kapt」被提及時,我才意識到有任何東西可以嘗試解決它。我反覆閱讀JetBrains頁面「java-interop」,找不到任何暗示如何處理它的東西。 IntelliJ不會在編輯器中將其標記爲錯誤,但在IntelliJ和Gradle(通過JetBrains kotlin gradle插件)中編譯都不起作用。 –

回答

24

一般來說,不,它不行。這種行爲的原因是Lombok是javac的註釋處理器,但是當t他kotlin編譯器運行它使用javac,但沒有註釋處理,所以這就是爲什麼kotlin看不到尚未生成的聲明。

現在唯一的解決方法是定義嚴格的編譯順序:首先是Java,然後是kotlin。不幸的是,這種方法有很大的缺點:在這種情況下,你不能使用Java的Kotlin代碼。要解決它,您可能需要多模塊項目,可能會導致很多痛苦

+2

嗯,該死。是的,我已經在我的程序中取了一大堆Java,並專門將它移植到Kotlin,以瞭解Java-> Kotlin-> Java支持是如何工作的。目標是隨着時間遷移代碼。但是,我們在所有域名POJO中都使用了Lombok。也許我可以在compileJava之前破解一個「compilePOJOs」目標。 –

+2

謝爾蓋,有JetBrains鏈接/常見問題解答,瞭解Kotlin如何查看位於同一地點的Java代碼(相同的模塊)? Gradle在compileJava之前執行compileKotlin,但顯然Kotlin知道Java代碼(除了註釋預處理)。在編譯.kt文件之前,Kotlin編譯器是否掃描Java代碼? –

+2

你並不孤單,我們有Spring Roo生成了POJO,而Kotlin也沒有看到它們,因爲Sergey說過的原因相同。 – user2138356

1

正如它在上面的評論中提到的,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> 
0

爲了增加謝爾蓋馬史剋夫的反應(加在這裏我沒有足夠的代表處點對此發表評論),這裏有一個搖籃多項目設置的example app Kotlin可以看到Lombok生成的代碼(沒有kapt或去嵌套處理),注意事項的確適用 - 即Kotlin可以調用Java代碼,但Java不能調用該特定模塊中的Kotlin代碼(因爲這會創建循環依賴) 。如果你有一個現有的Java代碼庫,並且所有的新代碼都是用Kotlin編寫的,這種構建可能是合適的,但是,我很樂意看到完整的Lombok/Kotlin支持,儘管Kotlin與Java完全互操作,實際情況是Lombok使用非常廣泛,而這個問題可能會阻止大量希望切換到Kotlin的開發人員。