モジュール化したプロジェクトでLombokを使うときの設定

Java

モジュール化したJavaプロジェクトでLombokを使用するときは、pom.xmlを少し変更する必要があるようです。
最終的な pom.xml 全体は最後に方にあります。

不適合な型: java.lang.Stringをlombok.valに変換できません

ビルド時のエラー内容です。

> mvn clean package
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building lombok 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ lombok ---
[INFO] Deleting C:\temp\sample-lombok\target
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ lombok ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ lombok ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 2 source files to C:\temp\sample-lombok\target\classes
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] /C:/temp/sample-lombok/src/main/java/sample/lombok/App.java:[8,25] 不適合な型: java.lang.Stringをlombok.valに変換できません:
[INFO] 1 error
[INFO] -------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.392 s
[INFO] Finished at: 2020-05-06T12:17:38+09:00
[INFO] Final Memory: 16M/60M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.0:compile (default-compile) on project lombok: Compilation failure
[ERROR] /C:/temp/sample-lombok/src/main/java/sample/lombok/App.java:[8,25] 不適合な型: java.lang.Stringをlombok.valに変換できません:
[ERROR]
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException

解決方法

Maven Compiler PluginにLombokのパスを追加するとビルドできるようになりました。
参考: https://github.com/rzwitserloot/lombok/issues/2125

<annotationProcessorPaths>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>${lombok.version}</version>
    </dependency>
</annotationProcessorPaths>

Error occurred during initialization of boot layer

アプリケーションの実行時に発生したエラー内容です。

Error occurred during initialization of boot layer
java.lang.module.ResolutionException: Module lombok does not read a module that exports org.mapstruct.ap.spi

解決方法

この問題はLombokのバージョン 1.18.13 で解決されるようですがMavenリポジトリーに公開されていなかったのでEdgeバージョンを使用しました。
参考: https://projectlombok.org/download-edge

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>edge-SNAPSHOT</version>
    <scope>provided</scope>
</dependency>
<repositories>
    <repository>
        <id>projectlombok.org</id>
        <url>https://projectlombok.org/edge-releases</url>
    </repository>
</repositories>

MapStructを依存関係に追加することでも回避できるようです。

<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-processor</artifactId>
    <version>1.3.1.Final</version>
    <scope>provided</scope>
</dependency>

サンプルプロジェクト

エラー内容を再現できるプロジェクトの内容です。

App.java

Lombokのvalを使用して「Hello, world!」の文字列を出力するサンプルです。

package sample.lombok;

import lombok.val;

public class App {

	public static void main(String[] args) {
		val a = "Hello, world!";
		System.out.println(a);
	}
}

module-info.java

lombokを使用するので「requires static lombok;」を追加しています。

module sample.lombok {
	requires static lombok;
	exports sample.lombok;
}

変更前のpom.xml

Javaのバージョンは11、Lombokのバージョン 1.18.12 です。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>sample</groupId>
    <artifactId>lombok</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <release>11</release>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

最終的なpom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>sample</groupId>
    <artifactId>lombok</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <lombok.version>edge-SNAPSHOT</lombok.version>
    </properties>
    <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>
                <version>3.8.0</version>
                <configuration>
                    <release>11</release>
                    <annotationProcessorPaths>
                        <dependency>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>${lombok.version}</version>
                        </dependency>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <repositories>
        <repository>
            <id>projectlombok.org</id>
            <url>https://projectlombok.org/edge-releases</url>
        </repository>
    </repositories>
</project>
タイトルとURLをコピーしました