2016-02-20 9 views
34

Kotlin 1.0.0リリース(IntelliJ 15でコンパイル)を使用しています。ロンボクベースのPOJOを参照KotlinにJava Lombokアクセサが表示されませんか?

println(myPojoInstance.foo) 

それは(のIntelliJかのGradleで)コードをコンパイルしようとすると、エラーを与える「『foo』をアクセスできません:それはの 『プライベート』である 『MyPojo』真である、彼ら私のオブジェクトはすべて非公開で、私のオブジェクトは@Value @Builder for lombokアノテーションを持っています。

私は特にgetFoo()を呼び出そうとしましたが、 "getFooの未解決の参照"と書いてあります。ロンボクのアノテーションを処理するには?

+1

あなたは 'kapt'を使いましたか? http://blog.jetbrains.com/kotlin/2015/06/better-annotation-processing-supporting-stubs-in-kapt/ – voddan

+0

@voddanが指摘しているように、あなたが使ったことについて十分な情報を提供していないこれを解決する。また、Kaptを試した場合、それは1つのモジュール内か複数のモジュール内かです。 –

+1

私は「kapt」が言及されるまで、それを解決しようとするものがあることを知りませんでした。私はJetBrainsのページ "java-interop"を繰り返し読んで、それに対処する方法をヒントできませんでした。 IntelliJはエディターでエラーとしてフラグを立てませんが、IntelliJとGradleの両方で(JetBrains kotlin gradle plugin経由で)コンパイルが機能しませんでした。 –

答えて

24

一般的には、そうではありません。その理由は、ロンボクはjavacのアノテーションプロセッサですが、彼はkotlinコンパイラを実行してjavacも使用しますが、アノテーション処理は行われないため、kotlinはまだ生成されていない宣言を表示しません。

厳密なコンパイル順序を定義するのが唯一の回避策です。Javaは最初に、その後はkotlinです。残念ながら、このアプローチには大きな欠点があります。この場合、JavaからKotlinコードを使用することはできません。これを回避するには、多量の痛みを引き起こす可能性のあるマルチモジュールプロジェクトが必要な場合があります。

+2

さて、ダーン。そうですね、私はプログラムの途中でJavaの断片をとり、Java-> Kotlin-> Javaのサポートがどのように機能するかを見るために、特にKotlinに移行しました。目標は時間の経過とともにコードを移行することです。しかし、私たちはすべてのドメインPOJOでLombokを頻繁に使用しています。おそらく、私はcompileJavaの前に実行する "compilePOJOs"ターゲットをハックすることができます。 –

+2

Sergey、JetBrainsのリンクはありますか?Kotlinが同じ場所にあるJavaコード(同じモジュール)をどのように見ていますか? GradleはcompileJavaの前にKotlinをコンパイルしますが、明らかにKotlinはJavaコードについて知っています(注釈の前処理とは別に)。 Kotlinコンパイラは.ktファイルをコンパイルする前にJavaコードをスキャンしますか? –

+2

あなたは一人ではありません。私たちはSpring RooにPOJOを生成させました。そして、Sergeyによると同じ理由でKotlinもそれらを見ません。 – 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

はセルゲイMashkovの応答に追加するには、ここではGradleのマルチプロジェクトのセットアップのexample appだ(私はそれにコメントするのに十分な担当者のポイントを持っていないここに追加) (KotlinはJavaコードを呼び出すことができますが、Javaはその特定のモジュールでKotlinコードを呼び出すことはできません(これは循環依存を作成するためです)あなたが既存のJavaコードベースを持っていて、新しいコードがすべてKotlinに書かれているならば、この種のビルドは適切かもしれません。

しかし、私は完全なLombok/Kotlinサポートを見たいと思っています。現実的にはロンボクが非常に広く使われているため、この問題はKotlinに切り替えることを望む多数の開発者を妨げる可能性があります。