- JAVA
Lombokが効かない原因と直し方|cannot find symbol
@Data や @Getter を付けたのに error: cannot find symbol symbol: method getName() になるのは、コンパイルのときに Lombok(アノテーションプロセッサー)が動いていないためです。 Lombok はコンパイルの途中で getter・setter を作るので、動かなければ、そのメソッドは存在しません。
いちばん多い原因は、次の3つです。
| 原因 | 症状 | 直し方 |
|---|---|---|
| JDK 23 以降で、Lombok を依存(クラスパス)に入れただけ | JDK 21 では動いていたのに、JDK を上げたら cannot find symbol |
Maven は annotationProcessorPaths、Gradle は annotationProcessor に Lombok を書く |
Gradle で compileOnly だけ書いている |
JDK の版に関係なく cannot find symbol |
annotationProcessor も書く |
| Lombok が、使っている JDK に対応していない | ExceptionInInitializerError、TypeTag :: UNKNOWN などで落ちる |
Lombok を JDK に対応した版に上げる |
確認環境:JDK 11・17・21・25、Lombok 1.18.24(Ubuntu の配布版)、Apache Maven 3.9.11(maven-compiler-plugin 3.10.1)、Gradle 8.14.3(確認日 2026年10月11日)。同じソースを JDK と設定を変えてコンパイルしました。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Lombokが効かない原因と直し方|cannot find symbol」
再現:同じコードが、JDK 21 では通り、JDK 25 では通らない
@Data
public class User {
private String name;
private int age;
}
User u = new User();
u.setName("佐藤");
System.out.println(u.getName() + " " + u);
Lombok の jar をクラスパスに入れるだけ(javac -cp lombok.jar、Maven の <dependency> だけ)でコンパイルしました。
| JDK | 結果 |
|---|---|
| 11・17 | 成功 |
| 21 | 成功。ただし下の注意(Note)が表示される |
| 25 | cannot find symbol |
(JDK 21)
Note: Annotation processing is enabled because one or more processors were found
on the class path. A future release of javac may disable annotation processing
unless at least one processor is specified by name (-processor), or a search
path is specified (--processor-path, --processor-module-path), or annotation
processing is enabled explicitly (-proc:only, -proc:full).
(JDK 25)
src/demo/Main.java:5: error: cannot find symbol
u.setName("佐藤");
^
symbol: method setName(String)
location: variable u of type User
JDK 21 の注意で予告されていたとおり、JDK 23 からは、クラスパスにあるアノテーションプロセッサーが自動では動かなくなりました。 JDK 23 のリリースノートでも、アノテーション処理は明示的に設定したときだけ動くようになったとされています。
Maven でも同じでした。
(JDK 21) [INFO] BUILD SUCCESS
(JDK 25) [ERROR] .../Main.java:[5,10] cannot find symbol
symbol: method setName(java.lang.String)
直し方1:Maven は annotationProcessorPaths に書く
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
依存(<dependency>)と、annotationProcessorPaths の両方に書きます。 Lombok 公式の Maven の設定ページでも、annotationProcessorPaths への追加は「JDK 23 以降では必須」とされています。確認環境でも、JDK 21 ではこの設定で BUILD SUCCESS、JDK 25 では Lombok が動き出しました(下の直し方3へ)。
javac の -proc:full(以前と同じく、クラスパスのプロセッサーを動かす)を compilerArgs に渡す方法でも Lombok は動きましたが、どのプロセッサーを動かすかがはっきりする annotationProcessorPaths のほうがおすすめです。
直し方2:Gradle は annotationProcessor も書く
dependencies {
compileOnly("org.projectlombok:lombok:1.18.48")
annotationProcessor("org.projectlombok:lombok:1.18.48")
testCompileOnly("org.projectlombok:lombok:1.18.48") // テストでも使うなら
testAnnotationProcessor("org.projectlombok:lombok:1.18.48")
}
| build.gradle.kts | 結果(JDK 21) |
|---|---|
compileOnly だけ |
cannot find symbol(JDK 21 でも) |
compileOnly + annotationProcessor |
成功 |
Gradle は、compileOnly に書いたものをアノテーションプロセッサーとしては使いません。 JDK の版に関係なく、annotationProcessor が必要です(Lombok 公式の Gradle の設定ページの例も、この4行です)。テストのコードで Lombok を使うなら、testAnnotationProcessor も書きます。
直し方3:Lombok を JDK に対応した版に上げる
annotationProcessorPaths を書いて JDK 25 でコンパイルすると、今度は Lombok 1.18.24 そのものが落ちました。
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.10.1:compile ...
Fatal error compiling: java.lang.ExceptionInInitializerError: com.sun.tools.javac.code.TypeTag :: UNKNOWN
(javac で直接実行したとき)
An annotation processor threw an uncaught exception.
java.lang.ExceptionInInitializerError
at lombok.javac.apt.LombokProcessor.placePostCompileAndDontMakeForceRoundDummiesHook(LombokProcessor.java:175)
...
Caused by: java.lang.NoSuchFieldException: com.sun.tools.javac.code.TypeTag :: UNKNOWN
Lombok は javac の内部を使うため、新しい JDK にはそれに対応した版の Lombok が必要です。 Lombok 公式の変更履歴では、各 JDK への対応は次の版からです。
| JDK | 対応した Lombok の版 |
|---|---|
| 21 | 1.18.30 |
| 22 | 1.18.32 |
| 23 | 1.18.36 |
| 24 | 1.18.38 |
| 25 | 1.18.40 |
lombok と lombok.javac が出てくるスタックトレースや、TypeTag・JCTree などの javac の内部のクラス名が出たら、Lombok の版を疑います。Spring Boot を使っている場合は、Spring Boot が管理している Lombok の版を使うのが手軽です(親の pom・BOM が版を決めている)。
3つの原因の見分け方
| エラーの出方 | 原因 |
|---|---|
cannot find symbol だけが出る(Lombok の名前は出ない) |
Lombok が動いていない(設定の不足) |
JDK 21 で Annotation processing is enabled because... の Note が出ている |
今は動いているが、JDK 23 以降で動かなくなる設定 |
lombok.javac... のスタックトレース、ExceptionInInitializerError |
Lombok の版が JDK に対応していない |
IDE だけでエラーになるとき
コマンドラインのビルド(mvn compile・gradle build)は通るのに、IDE の画面だけ赤くなる場合は、IDE 側の設定です。
| 確認すること | 内容 |
|---|---|
| IDE がビルドに使う JDK | IDE のプロジェクトの JDK と、ビルドツールの JDK が違わないか |
| アノテーション処理の設定 | IDE の設定で、アノテーションプロセッサーが有効になっているか |
| ビルドの設定の読み込み直し | pom.xml・build.gradle を変えたあとに、IDE に読み込み直させたか |
確認の手順(チェックリスト)
| 順番 | 確認すること | 方法 |
|---|---|---|
| 1 | JDK の版 | mvn -v・gradle -v・java -version。23 以降なら設定が必要 |
| 2 | Maven の設定 | <dependency>(provided)と annotationProcessorPaths の両方 |
| 3 | Gradle の設定 | compileOnly と annotationProcessor の両方(テストは test〜も) |
| 4 | Lombok の版 | 使っている JDK に対応しているか(上の表) |
| 5 | エラーの形 | cannot find symbol だけ → 設定、lombok.javac のスタックトレース → 版 |
| 6 | IDE だけのエラー | IDE の JDK・アノテーション処理の設定・読み込み直し |
よくある質問
Q. JDK 21 で Note が出ていますが、そのままで問題ありませんか。
A. JDK 21 では動きますが、JDK 23 以降に上げると cannot find symbol になります。今のうちに annotationProcessorPaths(Gradle は annotationProcessor)を書いておくと、JDK を上げても止まりません。
Q. 確認環境の Lombok 1.18.24 は、JDK 21 で動いていました。 A. 確認環境では動きましたが、Lombok 公式の変更履歴で JDK 21 への対応が入ったのは 1.18.30 です。JDK 21 以降では、公式に対応した版を使うのが安全です。
まとめ
- Lombok が動いていないと、getter・setter が作られず
cannot find symbol - JDK 23 から、クラスパスのアノテーションプロセッサーは自動では動かない。JDK 21 の Note はその予告
- Maven は
annotationProcessorPaths、Gradle はannotationProcessorに Lombok を書く(依存と両方) - Gradle は
compileOnlyだけでは、JDK 21 でも動かない ExceptionInInitializerError・TypeTag :: UNKNOWNは、Lombok がその JDK に対応していない。JDK 25 なら 1.18.40 以降
参考・出典
確認日はいずれも 2026年10月11日です。
- Oracle「JDK 23 Release Notes」(Annotation processing in javac disabled by default):https://www.oracle.com/java/technologies/javase/23-relnote-issues.html
- Project Lombok「Maven」:https://projectlombok.org/setup/maven
- Project Lombok「Gradle」:https://projectlombok.org/setup/gradle
- Project Lombok「Changelog」:https://projectlombok.org/changelog
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Lombokが効かない原因と直し方|cannot find symbol」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。