Maven编译插件无法识别Lombok的注解。

5

在我的应用程序中,我有以下3个模块:

permissions (parent pom)
|---permission-api (just api, without main spring class)
|---permission-service (spring boot app)

在主模块的父POM中,我有一个包含以下内容的POM:
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.6.3</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<modules>
    <module>permissions-api</module>
    <module>permissions-service</module>
</modules>

和一些依赖项。现在我想使用maven clean install命令构建整个项目。Permission-api模块已经构建成功(lombok注释没有出现问题)。在pom文件中,只有对lombok的引用:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

无论我尝试构建仅permission-serivce还是整个项目,都会出现以下编译错误:
cannot find symbol
[ERROR]   symbol:   method getPermissionsList()
[ERROR]   location: variable employee of type permissions.model.entity.Employee

我知道我应该在pom.xml中添加maven-compiler-plugin (我也尝试将其添加到父POM中),并且我已经这样做了,但是它没有起作用。
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${maven-compiler-plugin.version}</version>
                <configuration>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>${lombok.version}</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
        </plugins>
    </build>

你能告诉我我做错了什么吗?


当您不披露完整的pom文件和相关类(如Employee以及包含该变量的任何类)时,我们很难为您提供帮助。 - Johannes
3个回答

2
同时,我找到了一个解决方案。当我添加以下内容时,一切开始正常工作:
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-envers</artifactId>
    <version>${hibernate.version}</version>
</dependency>

可能是缺少依赖项导致了第一个编译错误,而maven编译器不正确地将下一个lombok“缺少注释”显示为编译错误。

1

依赖关系,例如projectlombok.org中的依赖关系,应该在作用域“提供”范围内,这意味着它仅在编译时需要,但在运行时不需要:

<dependencies>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.22</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

这应该足够了。


1
仍然不起作用 :( 我不知道为什么在permissions-api中它每次都能工作,在permission-service中无论我是否在pom中包含maven-compiler-plugin,它都不起作用。 - MrFisherman
这里有一个相同或类似的问题。在父POM中配置了lombok依赖项,这应该足够了,不是吗?还是我们仍然需要指定annotationProcessorPath?但是,在子模块中,lombok无法生成getter、setter和日志。顺便说一句,在eclipse中一切看起来都很好... Java 17,Maven编译器插件3.10.1,Lombok版本1.18.24。 - r-uu
@r-uu 你需要明确启用 lombok。它作为依赖项即可。如下所示:https://dev59.com/QMPra4cB1Zd3GeqPpNOj#71450923我假设您已经在父pom中定义了依赖关系管理,就像我上面的答案一样。然后每个子模块都需要一个(简单的)依赖项。然后不需要版本和范围。 - Augustin Ghauratto

0

当您使用“optional true”时,您会阻止依赖项迭代地传递给其子级。移除“optional”即可解决该问题。

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接