com4dc’s blog

Javaプログラマーのはずだけど運用してます

Java12でLombok

Lombokが動かない

普段、Spring系のプロジェクトは Spring Initializr のお世話になっているのだが、はて?すべてを理解して使っているだろうかと、素のGradleプロジェクトからシコシコ構築していた。

いつも通り Lombok を導入して Compile したところこんなエラーが。

エラー: 変数nameは、デフォルト・コンストラクタで初期化されていません

おや?

環境

検証した環境は以下の通り。 普段との違いは、Windows環境であることとJavaのバージョンが結構上がってることくらい。

コード

エラー対象のコードはこちら。

import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public class GreetingResponse {

    private final String name;
    private final String message;
}

Gradleはこちら。

dependencies {
    implementation "org.springframework.boot:spring-boot-starter-webflux:$springWebfluxVersion"
    compileOnly "org.projectlombok:lombok:$lombokVersion"

    testImplementation "org.springframework.boot:spring-boot-starter-test:$springWebfluxVersion"
    testImplementation 'io.projectreactor:reactor-test'
    testCompile group: 'junit', name: 'junit', version: '4.12'
}

Version情報は以下の通り

springWebfluxVersion = 2.2.5.RELEASE
lombokVersion = 1.18.12

Lombok Pluginは導入済み。 Enable annotation processing は有効済み。

はて?おかしいところはないはずなんだが・・・。

Java12 + Lombok

そういえばJavaのあるバージョン以降(詳しい分岐点を忘れた)、既存のLombok導入ではダメだったのをふと思い出した。 Java12は無罪でした。すいません。追記参照

ざっと検索したところ以下を見つけた。

stackoverflow.com

あたり。 annotationProcessor にも Lombok を指定してやる必要があった。以下で解決。

dependencies {
    implementation "org.springframework.boot:spring-boot-starter-webflux:$springWebfluxVersion"
    compileOnly "org.projectlombok:lombok:$lombokVersion"
    annotationProcessor "org.projectlombok:lombok:$lombokVersion" // Add
    ...
}

Compile 成功。この辺り細かい違いがあって Migration が面倒そう。

追記

Twitterで「それJava関係ないやで。Gradleの問題やで」と教えてもらった。

qiita.com

Gradle 5.0 からはアノテーションプロセッサをコンパイル時のクラスパスから取得する方法がサポートされなくなるらしい。

なるほど。これですな。

#Mon Mar 09 22:44:33 JST 2020
distributionUrl=https\://services.gradle.org/distributions/gradle-5.2.1-bin.zip
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME

5.2.1 を利用していた。

Java12は無罪でした。ごめんなさい。