Lombok 和 module-info.java

Tim*_*son 4 java lombok java-module

我正在转换现有的 Java 库以使用 module-info.java。我广泛使用 Lombok 和泛型。当我运行“mvn package”时,我收到大量遵循以下模式的错误:

[ERROR] /projects/app/src/main/java/com/whatever/app/server/handlers/HandlerCreateForumPost.java:[116,13] cannot find symbol
[ERROR]   symbol:   method <com.whatever.app.common.messages.CreateForumPostResults>builder()
[ERROR]   location: class com.whatever.app.common.Response
Run Code Online (Sandbox Code Playgroud)

导致错误的语句是:

return Response
    .<CreateForumPostResults>builder()
    .success(true)
    .requestID(context.getRequestID())
    .results(
        CreateForumPostResults
            .builder()
            .id(forumPostID)
            .build()
    )
    .build();
Run Code Online (Sandbox Code Playgroud)

错误中报告的第 116 行是“.builder()”。

Response 类位于 com.whatever.app.common 中,定义为:

package com.whatever.app.common;

import lombok.Getter;
import lombok.Setter;
import lombok.experimental.SuperBuilder;
import lombok.extern.jackson.Jacksonized;

@SuperBuilder
@Jacksonized
@Getter
@Setter
public class Response<T extends Response.Results> {
    boolean success;
    String message;
    String requestID;
    T results;

    @SuperBuilder
    @Jacksonized
    @Getter
    @Setter
    public static class Results {

    }
}
Run Code Online (Sandbox Code Playgroud)

CreateForumPostResults 类位于 com.whatever.app.common.messages 中并扩展了 Response.Results:

package com.whatever.app.common.messages;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.whatever.app.common.AppResponse;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.SuperBuilder;
import lombok.extern.jackson.Jacksonized;

import java.util.UUID;

@SuperBuilder
@Getter
@Setter
@Jacksonized
public class AppCreateForumPostResults extends AppResponse.Results {
    @JsonProperty("id")
    UUID id;
}
Run Code Online (Sandbox Code Playgroud)

我的 module-info.java 看起来像这样:

module com.whatever.app.common {
    exports com.whatever.app.common;
    exports com.whatever.app.common.messages;

    requires com.fasterxml.jackson.annotation;
    requires com.fasterxml.jackson.core;
    requires com.fasterxml.jackson.databind;
    requires com.fasterxml.jackson.datatype.jsr310;
    requires com.google.common;
    requires lombok;
}
Run Code Online (Sandbox Code Playgroud)

我的POM如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <artifactId>app</artifactId>
        <groupId>com.whatever</groupId>
        <version>0.9</version>
    </parent>

    <artifactId>app-common</artifactId>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <maven.compiler.plugin.version>3.8.1</maven.compiler.plugin.version>

        <maven.jar.plugin.version>3.2.0</maven.jar.plugin.version>

        <guava-version>23.0</guava-version>

        <jackson-version>2.13.1</jackson-version>

        <lombok-version>1.18.22</lombok-version>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${maven.compiler.plugin.version}</version>
                <configuration>
                    <source>${maven.compiler.source}</source>
                    <target>${maven.compiler.target}</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>${maven.jar.plugin.version}</version>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${jackson-version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jsr310</artifactId>
            <version>${jackson-version}</version>
        </dependency>

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>${guava-version}</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok-version}</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
</project>
Run Code Online (Sandbox Code Playgroud)

我怀疑需要一些魔法才能使 Lombok 的 @Builder 注释(可能还有其他注释)与 module-info.java 一起工作,或者可能是与泛型相关的东西导致了这个问题,但我一直无法弄清楚这是什么。

我究竟做错了什么?

任何见解都将不胜感激。

Tim*_*son 9

通常情况下,花时间清楚地写下这个问题可以让我找到我正在寻找的答案。简短版本,我需要修改 maven-compiler-plugin 配置如下:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>${maven.compiler.plugin.version}</version>
            <configuration>
                <source>${maven.compiler.source}</source>
                <target>${maven.compiler.target}</target>
                <annotationProcessorPaths>
                    <annotationProcessorPath>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                        <version>${lombok-version}</version>
                    </annotationProcessorPath>
                </annotationProcessorPaths>
            </configuration>
        </plugin>
Run Code Online (Sandbox Code Playgroud)

  • 对于一些额外的上下文 - 在“模块模式”编译出现之前,类路径上的任何注释处理器都会自动应用。在模块模式编译领域,事情就没那么简单了。最好向编译器显式提及所有 AP(“&lt;annotationProcessorPaths&gt;”就是这么做的)。有关更多信息,请参阅[Project Lombok 关于 maven 的页面](https://projectlombok.org/setup/maven)。 (2认同)