web-dev-qa-db-ja.com

KotlinにはJava Lombokアクセサーが表示されませんか?

Kotlin 1.0.0リリースを使用(IntelliJ 15でコンパイル)。

println(myPojoInstance.foo)

LombokベースのPOJOを参照するコード(IntelliJまたはGradle)をコンパイルしようとすると、「 'foo'にアクセスできません: "MyPojo"の 'private'です。これはすべて、プライベートでオブジェクトです」というエラーが表示されます。ロンボク注釈用の@Value @Builderがあります。

具体的にgetFoo()を呼び出してみましたが、「getFooの未解決の参照」と表示されます。 Kotlinにロンボクアノテーションの処理方法を認識させるためのトリックがおそらくありますか?

55
Chris Kessel

通常、いいえ、そうではありません。その動作の理由は、Lombokがjavacの注釈プロセッサであるが、kotlinコンパイラーがjavacを使用するが、注釈処理がないため、kotlinがまだ生成されていない宣言を表示しないためです。

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

46
Sergey Mashkov

Sergey Mashkovの応答に追加するには(ここにコメントするのに十分な担当者がいません)、コトリンがLombokで生成されたコードを見ることができるGradleマルチプロジェクト設定の アプリの例 (kaptやデロンボキングなし。警告が適用されます。つまり、KotlinはJavaコードを呼び出すことができますが、Javaはその特定のモジュールでKotlinコードを呼び出すことはできません(これにより循環依存関係が作成されるため。)この種のビルドは、既存のJavaコードベースがあり、すべての新しいコードがKotlinで記述されている場合に適しています。

ただし、Lombok/Kotlinの完全なサポートが必要です。 KotlinはJavaと完全に相互運用できますが、現実にはLombokが非常に広く使用されており、この問題により、Kotlinへの切り替えを希望する多数の開発者がこれを行えない場合があります。

3
NKR

上記のコメントで述べたように、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>
2
Pavel S.

site に従ってdelombokを使用し、build> plugins> plugin> kotlin-maven-pluginの下のpom.xmlにtarget/generated-sources/delombokフォルダーを追加すると動作するように見えます

0